Wie kann ich Spaltennamen aus einer Tabelle in Oracle abrufen?

184

Ich muss die Datenbank abfragen, um die Spaltennamen zu erhalten , und darf nicht mit den Daten in der Tabelle verwechselt werden. Zum Beispiel, wenn ich eine Tabelle mit dem Namen habe , EVENT_LOGdas enthält eventID, eventType, eventDesc, und eventTime, dann würde ich mag sonst diese Feldnamen aus der Abfrage und nichts holen.

Wie das geht, habe ich gefunden in:

Aber ich muss wissen: Wie kann das in Oracle gemacht werden ?

Paxenos
quelle

Antworten:

191

Sie können die Tabelle USER_TAB_COLUMNS nach Tabellenspaltenmetadaten abfragen.

SELECT table_name, column_name, data_type, data_length
FROM USER_TAB_COLUMNS
WHERE table_name = 'MYTABLE'
Baretta
quelle
21
Beachten Sie, dass dies spezifisch für Oracle ist.
ConcernedOfTunbridgeWells
8
Gibt es einen Grund, warum dies "keine Zeilen ausgewählt" zurückgeben könnte? (In Oracle.)
Ian R. O'Brien
9
Wenn Sie ‚keine Zeilen ausgewählt‘ haben , dann können Sie zu ändern versuchen USER_TAB_COLUMNSzu all_tab_columns. Um 100% sicher über das Ergebnis zu sein, könnten Sie einen besonderen Besitzer haben.
Dracontis
2
Sie können "ORDER by column_id" hinzufügen, falls Sie sie in derselben Reihenfolge abrufen möchten, in der sie in der Tabelle erstellt wurden. Hier sind einige andere relevante Spaltendaten aus der Tabelle docs.oracle.com/cd/B19306_01/server.102/b14237/…
Bernauer
2
Stellen Sie sicher, dass der Tabellenname in Großbuchstaben angegeben ist.
Hugh Seagraves
67

In SQL Server ...

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

Typ = 'V' für Ansichten Typ = 'U' für Tabellen

Eppz
quelle
39

Du kannst das:

describe EVENT_LOG

oder

desc EVENT_LOG

Hinweis: Nur anwendbar, wenn Sie den Tabellennamen kennen und speziell für Oracle.

Sergey Golovchenko
quelle
26

Für SQL Server 2008 können wir information_schema.columns verwenden, um Spalteninformationen abzurufen

SELECT *
FROM   information_schema.columns
WHERE  table_name = 'Table_Name'
ORDER  BY ordinal_position  
Jom
quelle
1
Beachten Sie, dass die INFORMATION_SCHEMATabellen die ANSI-Standardmetadatentabellen sind. Jedes gute, moderne RDBMS wird sie haben.
Bacon Bits
18

Für SQLite können Sie meines Erachtens Folgendes verwenden:

PRAGMA table_info(table-name);

Erklärung von sqlite.org:

Dieses Pragma gibt eine Zeile für jede Spalte in der benannten Tabelle zurück. Zu den Spalten in der Ergebnismenge gehören der Spaltenname, der Datentyp, ob die Spalte NULL sein kann oder nicht, und der Standardwert für die Spalte. Die Spalte "pk" in der Ergebnismenge ist Null für Spalten, die nicht Teil des Primärschlüssels sind, und der Index der Spalte im Primärschlüssel für Spalten, die Teil des Primärschlüssels sind.

Siehe auch: Sqlite.org Pragma Table Info

Schildzerstörung
quelle
1
Ich bin mir nicht sicher, warum ich nicht gewählt wurde, aber ich bin froh, dass es dir geholfen hat.
Shieldstroy
2
Möglicherweise wurde es abgelehnt, weil die Frage mit Oracle gekennzeichnet ist.
Burhan Ali
2
Ich habe das Oracle-Tag entfernt und dies positiv bewertet. Da es so viele Antworten gibt, funktioniert diese Frage besser als eine allgemeine. (Ich kam hierher auf der Suche nach dem mySQL.)
Eiswasser
16

Diese Informationen werden in der ALL_TAB_COLUMNSSystemtabelle gespeichert :

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

DUMMY

Oder Sie könnten DESCRIBEdie Tabelle, wenn Sie SQL * PLUS verwenden:

SQL> desc dual
Name                               Null?    Type
----------------------------------------------------- -------- ---------------------- -------------
DUMMY                               VARCHAR2(1)
Jon Ericson
quelle
Offizielle Dokumentation ALL_TAB_COLUMNSüber die offizielle Oracle- Datenbankreferenz . Diese Ansicht beschreibt die Spalten der Tabellen, Ansichten und Cluster, auf die der aktuelle Benutzer zugreifen kann.
Mr. Polywhirl
Aber wir können den Schemanamen nicht vor der Tabelle angeben, oder? Zum Beispiel, wenn ich so will select column_name from all_tab_columns where table_name = 'dbo.usertbl';
AhammadaliPK vor
9

Die anderen Antworten beantworten die Frage ausreichend, aber ich dachte, ich würde einige zusätzliche Informationen teilen. Andere beschreiben die Syntax "DESCRIBE table", um die Tabelleninformationen abzurufen. Wenn Sie die Informationen im gleichen Format erhalten möchten, jedoch ohne DESCRIBE, können Sie Folgendes tun:

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';

Wahrscheinlich spielt es keine Rolle, aber ich habe es früher geschrieben und es scheint zu passen.

Sasha
quelle
Incorrect Syntax near '|'
Wenn
4

Für Oracle

SELECT column_name FROM user_tab_cols WHERE table_name=UPPER('tableName');
jampez77
quelle
3
select column_name,* from information_schema.columns
 where table_name = 'YourTableName'
order by ordinal_position

quelle
Funktioniert diese Abfrage unter Angabe eines Spaltennamens und eines Sterns - "Spaltenname auswählen, *". Sie funktioniert nicht in Oracle.
Teja
3
describe YOUR_TABLE;

In deinem Fall :

describe EVENT_LOG;
Rohit
quelle
3

Verwenden Sie für MySQL

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

Auch dies ist eine der Möglichkeiten, wie wir es verwenden können

select * from product where 1 != 1
JaiSankarN
quelle
2

Für SQL Server:

SELECT [name] AS [Column Name]
FROM syscolumns
WHERE id = object_id('TABLE_NAME')
bstricks
quelle
2
SELECT COLUMN_NAME 'all_columns' 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME='user';
Experte eins
quelle
Willkommen bei Stack Overflow @expert one. Auch wenn Ihre Antwort korrekt zu sein scheint, fügen Sie bitte mehr Details und Erklärungen hinzu als juste 'code'. Es wäre für alle klarer.
Jean-Rémy Revy
1

Sie können dies auch versuchen, aber es sind möglicherweise mehr Informationen als Sie benötigen:

sp_columns TABLE_NAME
WEFX
quelle
1

MySQL

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

Dies ergibt ein Ergebnis wie das folgende:

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

Dann können Sie die Werte einfach herausziehen

fetch row[0]

Dies ist auch ideal für die dynamische Übergabe von Eingaben, da der REGEXP das '|' benötigt. für mehrere Eingaben, ist aber auch eine Möglichkeit, Daten getrennt zu halten und einfach zu speichern / an Klassen / Funktionen zu übergeben.

Versuchen Sie, aus Sicherheitsgründen beim Senden auch Dummy-Daten einzugeben, und vergleichen Sie, was beim Empfang von Fehlern zurückgegeben wurde.

Dbo
quelle
1

In Oracle gibt es zwei Ansichten, die Spalten beschreiben:

  • DBA_TAB_COLUMNS beschreibt die Spalten aller Tabellen, Ansichten und Cluster in der Datenbank.

  • USER_TAB_COLUMNS beschreibt die Spalten der Tabellen, Ansichten und
    Cluster, die dem aktuellen Benutzer gehören. In dieser Ansicht wird die
    Spalte EIGENTÜMER nicht angezeigt .

Renaud Kern
quelle
0

Die Antwort ist hier: http://php.net/manual/en/function.mysql-list-fields.php Ich würde in Ihrem Fall den folgenden Code verwenden:

$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'];
    }
}
user2558588
quelle
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'
Henry
quelle
0

Sie können diese Abfrage ausführen

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
quelle
-1

Wählen Sie einfach die erste Zeile aus der Tabelle für Orakel: select * from <table name> where rownum = 1;

blauer Himmel
quelle
Wofür steht Rownum? Muss ich eine Spalte mit dem Namen rownum verwenden?
Merve Bıçakçı
-1

Ich bin auf diese Frage gestoßen und habe nach Zugriff auf Spaltennamen in Teradata gesucht. Daher werde ich die Antwort für die SQL-Variante hinzufügen:

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

Die Informationen werden in der DBC-Datenbank gespeichert.

Das Abrufen von Datentypen ist etwas komplizierter : Abrufen des Spaltentyps mithilfe von Teradata-Systemtabellen

Karneval
quelle
-1

Versuche dies

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%'
pals17
quelle
-3
SELECT COLUMN_NAME 
FROM YourDatabase.INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME = 'YourTableName'
user3655399
quelle