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 ?

Paxenos
źródło

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'
Baretta
źródło
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

Eppz
źródło
39

Możesz to zrobić:

describe EVENT_LOG

lub

desc EVENT_LOG

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

Siergiej Golovchenko
źródło
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  
Jom
źródło
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

tarcza
źródło
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)
Jon Ericson
źródło
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ć.

Sasha
źródło
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');
jampez77
źródło
3
select column_name,* from information_schema.columns
 where table_name = 'YourTableName'
order by ordinal_position

źródło
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;
Rohit
źródło
3

W przypadku MySQL użyj

SELECT column_name 
FROM information_schema.columns 
WHERE 
table_schema = 'Schema' AND table_name = 'Table_Name'
ssamuel68
źródło
3

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

select * from product where 1 != 1
JaiSankarN
źródło
2

W przypadku programu SQL Server:

SELECT [name] AS [Column Name]
FROM syscolumns
WHERE id = object_id('TABLE_NAME')
klocki
źródło
2
SELECT COLUMN_NAME 'all_columns' 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME='user';
ekspert jeden
źródło
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
WEFX
źródło
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.

Dbo
źródło
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.

Renaud Kern
źródło
0

Odpowiedź jest tutaj: http://php.net/manual/en/function.mysql-list-fields.php W twoim przypadku użyłbym następującego kodu:

$result = mysql_query("SHOW COLUMNS FROM sometable");
if (!$result) {
    echo 'Could not run query: ' . mysql_error();
    exit;
}
$fields = array();
if (mysql_num_rows($result) > 0) {
    while ($row = mysql_fetch_assoc($result)) {
        $fields[] = $row['Field'];
    }
}
użytkownik2558588
źródło
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'
Henz
źródło
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;
Etibar Hasanov
źródło
-1

Po prostu wybierz pierwszy wiersz z tabeli, dla wyroczni: select * from <table name> where rownum = 1;

niebieskie niebo
źródło
Co oznacza rownum? Czy muszę używać kolumny o nazwie rownum?
merve bıçakçı
-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

carnust
źródło
-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%'
kumple17
źródło
-3
SELECT COLUMN_NAME 
FROM YourDatabase.INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME = 'YourTableName'
użytkownik3655399
źródło