Jak mogę uzyskać nazwy kolumn z tabeli w Oracle?


184

Muszę wysłać zapytanie do bazy danych, aby uzyskać nazwy kolumn , aby nie pomylić ich z danymi w tabeli. Na przykład, jeśli mam tabeli nazwie EVENT_LOG, która zawiera eventID, eventType, eventDesc, i eventTime, a potem będzie chciał odzyskać te nazwy pól z zapytania i nic innego.

Znalazłem, jak to zrobić w:

Ale muszę wiedzieć: jak można to zrobić w Oracle ?

Odpowiedzi:


191

Możesz wyszukać w tabeli USER_TAB_COLUMNS metadane kolumny tabeli.

SELECT table_name, column_name, data_type, data_length
FROM USER_TAB_COLUMNS
WHERE table_name = 'MYTABLE'

21
Pamiętaj, że dotyczy to wyłącznie Oracle.
ConcernedOfTunbridgeWells

8
Czy istnieje powód, dla którego może to zwrócić „nie wybrano wierszy”? (W Oracle.)
Ian R. O'Brien

9
Jeśli nie masz zaznaczonych wierszy, możesz spróbować zmienić USER_TAB_COLUMNSna all_tab_columns. Aby mieć 100% pewności co do wyniku, możesz speficywać właściciela.
Dracontis,

2
Możesz dodać „ZAMÓWIENIE według id_kolumny”, jeśli chcesz je odzyskać w tej samej kolejności, w jakiej zostały utworzone w tabeli. Oto kilka innych istotnych danych kolumny z tabeli docs.oracle.com/cd/B19306_01/server.102/b14237/...
Bernauer

2
Upewnij się, że nazwa tabeli jest pisana wielkimi literami.
Hugh Seagraves,

67

W SQL Server ...

SELECT [name] AS [Column Name]
FROM syscolumns
WHERE id = (SELECT id FROM sysobjects WHERE type = 'V' AND [Name] = 'Your table name')

Wpisz = „V” dla widoków Wpisz = „U” dla tabel


39

Możesz to zrobić:

describe EVENT_LOG

lub

desc EVENT_LOG

Uwaga: dotyczy tylko jeśli znasz nazwę tabeli, a konkretnie dla Oracle.


26

W przypadku SQL Server 2008 możemy użyć information_schema.columns do uzyskania informacji o kolumnie

SELECT *
FROM   information_schema.columns
WHERE  table_name = 'Table_Name'
ORDER  BY ordinal_position  

1
Należy pamiętać, że INFORMATION_SCHEMAtabele są standardowymi tabelami metadanych ANSI. Każdy dobry, nowoczesny RDBMS będzie je miał.
Bacon Bits,

18

W przypadku SQLite uważam, że możesz użyć czegoś takiego:

PRAGMA table_info(table-name);

Objaśnienie z sqlite.org:

Ta pragma zwraca jeden wiersz dla każdej kolumny w nazwanej tabeli. Kolumny w zestawie wyników zawierają nazwę kolumny, typ danych, czy kolumna może mieć wartość NULL, oraz wartość domyślną dla kolumny. Kolumna „pk” w zestawie wyników wynosi zero dla kolumn, które nie są częścią klucza podstawowego, i jest indeksem kolumny w kluczu podstawowym dla kolumn, które są częścią klucza podstawowego.

Zobacz także: Sqlite.org Pragma Table Info


1
Nie jestem też pewien, dlaczego zostałem odrzucony, ale cieszę się, że to pomogło.
shieldstroy

2
Być może zostało to odrzucone, ponieważ pytanie jest oznaczone jako Oracle.
Burhan Ali

2
Usunąłem tag Oracle i głosowałem za tym - pomyślałem, że skoro jest tak wiele odpowiedzi, to pytanie działa lepiej jako ogólne. (Przyszedłem tu w poszukiwaniu mySQL).
icedwater

16

Informacje te są przechowywane w ALL_TAB_COLUMNStabeli systemowej:

SQL> select column_name from all_tab_columns where table_name = 'DUAL';

DUMMY

Lub możesz DESCRIBEtabeli, jeśli używasz SQL * PLUS:

SQL> desc dual
Name                               Null?    Type
----------------------------------------------------- -------- ---------------------- -------------
DUMMY                               VARCHAR2(1)

Oficjalna dokumentacja za ALL_TAB_COLUMNSpośrednictwem oficjalnej bazy danych Oracle . Ten widok opisuje kolumny tabel, widoków i klastrów dostępnych dla bieżącego użytkownika.
Pan Polywhirl

Ale nie możemy podać nazwy schematu przed stołem, prawda? na przykład, jeśli chcę tak select column_name from all_tab_columns where table_name = 'dbo.usertbl';
AhammadaliPK

9

Inne odpowiedzi w wystarczający sposób odpowiadają na pytanie, ale pomyślałem, że podzielę się dodatkowymi informacjami. Inni opisują składnię „tabeli DESCRIBE” w celu uzyskania informacji o tabeli. Jeśli chcesz uzyskać informacje w tym samym formacie, ale bez korzystania z DESCRIBE, możesz:

SELECT column_name as COLUMN_NAME, nullable || '       ' as BE_NULL,
  SUBSTR(data_type || '(' || data_length || ')', 0, 10) as TYPE
 FROM all_tab_columns WHERE table_name = 'TABLENAME';

Prawdopodobnie nie ma to większego znaczenia, ale napisałem to wcześniej i wydaje się pasować.


Próbuję tego teraz (lata później) w programie SQL Server 2008, Incorrect Syntax near '|'
pojawia

4

Dla Oracle

SELECT column_name FROM user_tab_cols WHERE table_name=UPPER('tableName');

3
select column_name,* from information_schema.columns
 where table_name = 'YourTableName'
order by ordinal_position

działa to zapytanie, podając nazwę kolumny i gwiazdkę - „wybierz nazwę_kolumny, *” .. To nie działa w Oracle.
Teja,

3
describe YOUR_TABLE;

W Twoim przypadku :

describe EVENT_LOG;

3

W przypadku MySQL użyj

SELECT column_name 
FROM information_schema.columns 
WHERE 
table_schema = 'Schema' AND table_name = 'Table_Name'

3

Nawet w ten sposób możemy to wykorzystać

select * from product where 1 != 1

2

W przypadku programu SQL Server:

SELECT [name] AS [Column Name]
FROM syscolumns
WHERE id = object_id('TABLE_NAME')

2
SELECT COLUMN_NAME 'all_columns' 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME='user';

Witamy w Stack Overflow @expert one. Nawet jeśli twoja odpowiedź wydaje się dokładna, dodaj więcej szczegółów i wyjaśnień niż tylko „kod”. Byłoby to bardziej zrozumiałe dla wszystkich.
Jean-Rémy Revy

1

Możesz także spróbować tego, ale może to być więcej informacji niż potrzebujesz:

sp_columns TABLE_NAME

1

MySQL

SHOW COLUMNS FROM a_table_named_users WHERE Field REGEXP 'user_id|user_name|user_pass'

To zwróci wynik mniej więcej taki:

Field     |  Type        |   Null   |   Key   |   Default   |   Extra  
user_id      int(8)          NO         PRI       NULL          auto_increment
user_name    varchar(64)     NO         MUL       NULL
user_pass    varchar(64)     NO                   NULL

Następnie, aby wyciągnąć wartości, możesz po prostu

fetch row[0]

Jest to również świetne do dynamicznego przekazywania danych wejściowych, ponieważ REGEXP potrzebuje „|” dla wielu danych wejściowych, ale jest także sposobem na utrzymanie oddzielności danych i łatwego przechowywania / przekazywania do klas / funkcji.

Spróbuj też wrzucić fałszywe dane dla bezpieczeństwa podczas wysyłania i porównaj, co zostało zwrócone po otrzymaniu jakichkolwiek błędów.


1

W Oracle istnieją dwa widoki opisujące kolumny:

  • DBA_TAB_COLUMNS opisuje kolumny wszystkich tabel, widoków i klastrów w bazie danych.

  • USER_TAB_COLUMNS opisuje kolumny tabel, widoków i
    klastrów należących do bieżącego użytkownika. Ten widok nie wyświetla
    kolumny WŁAŚCICIEL.



0
SELECT A.COLUMN_NAME, A.* FROM all_tab_columns a 
WHERE table_name = 'Your Table Name'
AND A.COLUMN_NAME = 'COLUMN NAME' AND a.owner = 'Schema'

0

możesz uruchomić to zapytanie

SELECT t.name AS table_name,
SCHEMA_NAME(schema_id) AS schema_name,
c.name AS column_name
FROM sys.tables AS t
INNER JOIN sys.columns c ON t.OBJECT_ID = c.OBJECT_ID
WHERE c.name LIKE '%%' --if you want to find specific column write here 
ORDER BY schema_name, table_name;


-1

Przeszedłem przez to pytanie, szukając dostępu do nazw kolumn na Teradata, więc dodam odpowiedź dla ich „smaku” SQL:

SELECT ColumnName
FROM DBC.Columns
WHERE DatabaseName='DBASE_NAME'
AND TableName='TABLE_NAME';

Informacje są przechowywane w bazie danych DBC.

Pobieranie typów danych jest nieco bardziej zaangażowane: Uzyskaj typ kolumny za pomocą tabel systemowych teradata


-1

Spróbuj tego

select * from sys.all_columns c join sys.objects o on c.object_id=o.object_id where o.name = 'TABLENAME' and c.name like '%COLUMN NAME%'


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.