Come posso ottenere i nomi di colonna da una tabella in Oracle?


184

Ho bisogno di interrogare il database per ottenere i nomi delle colonne , da non confondere con i dati nella tabella. Per esempio, se ho una tabella denominata EVENT_LOGche contiene eventID, eventType, eventDesc, e eventTime, quindi vorrei recuperare i nomi dei campi dalla query e nient'altro.

Ho trovato come farlo in:

Ma devo sapere: come si può fare in Oracle ?

Risposte:


191

È possibile eseguire una query sulla tabella USER_TAB_COLUMNS per i metadati della colonna della tabella.

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

21
Si noti che questo è specifico per Oracle.
Preoccupato di TunbridgeWells

8
C'è qualche motivo per cui questo potrebbe restituire "nessuna riga selezionata"? (In Oracle.)
Ian R. O'Brien,

9
Se non hai "nessuna riga selezionata", puoi provare a cambiare USER_TAB_COLUMNS in all_tab_columns. Per essere sicuro al 100% dei risultati, potresti possedere il proprietario.
Dracontis,

2
Puoi aggiungere "ORDER by column_id" nel caso in cui desideri recuperarli nello stesso ordine in cui sono stati creati nella tabella. Ecco alcuni altri dati di colonna rilevanti dalla tabella docs.oracle.com/cd/B19306_01/server.102/b14237/…
Bernauer

2
Assicurarsi che il nome della tabella sia maiuscolo.
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')

Tipo = "V" per le viste Tipo = "U" per le tabelle


39

Puoi farlo:

describe EVENT_LOG

o

desc EVENT_LOG

Nota: applicabile solo se si conosce il nome della tabella e specificamente per Oracle.


26

Per SQL Server 2008, possiamo usare information_schema.columns per ottenere informazioni sulla colonna

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

1
Si noti che le INFORMATION_SCHEMAtabelle sono le tabelle di metadati standard ANSI. Ogni RDBMS buono e moderno li avrà.
Bacon Bits

18

Per SQLite credo che tu possa usare qualcosa di simile al seguente:

PRAGMA table_info(table-name);

Spiegazione da sqlite.org:

Questo pragma restituisce una riga per ogni colonna nella tabella denominata. Le colonne nel set di risultati includono il nome della colonna, il tipo di dati, indipendentemente dal fatto che la colonna possa essere NULL e il valore predefinito per la colonna. La colonna "pk" nel set di risultati è zero per le colonne che non fanno parte della chiave primaria ed è l'indice della colonna nella chiave primaria per le colonne che fanno parte della chiave primaria.

Vedi anche: Sqlite.org Informazioni sulla tabella Pragma


1
Non sono sicuro del motivo per cui ero stato votato, ma sono contento che ti abbia aiutato.
shieldstroy,

2
Potrebbe essere stato sottoposto a downgrade perché la domanda è taggata Oracle.
Burhan Ali,

2
Ho rimosso il tag Oracle e ho votato a favore - ho pensato che ci sono così tante risposte che questa domanda funziona meglio come generale. (Sono venuto qui alla ricerca di mySQL.)
Icedwater,

16

Tali informazioni sono memorizzate nella ALL_TAB_COLUMNStabella di sistema:

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

DUMMY

Oppure potresti DESCRIBEusare la tabella se stai usando SQL * PLUS:

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

Documentazione ufficiale ALL_TAB_COLUMNStramite il riferimento al database Oracle ufficiale . Questa vista descrive le colonne delle tabelle, delle viste e dei cluster accessibili all'utente corrente.
Mr. Polywhirl,

Ma non possiamo dare il nome dello schema davanti al tavolo, giusto? per esempio se voglio così select column_name from all_tab_columns where table_name = 'dbo.usertbl';
AhammadaliPK

9

Le altre risposte rispondono sufficientemente alla domanda, ma ho pensato di condividere alcune informazioni aggiuntive. Altri descrivono la sintassi "DESCRIBE table" per ottenere le informazioni sulla tabella. Se vuoi ottenere le informazioni nello stesso formato, ma senza usare DESCRIBE, puoi fare:

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

Probabilmente non importa molto, ma l'ho scritto prima e sembra adattarsi.


Provando questo ora (anni dopo) in SQL Server 2008, ricevo un Incorrect Syntax near '|'errore
Al Lelopath

4

Per 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

questa query funziona, specificando un nome col e star- "select column_name, *" .. Non funziona in Oracle.
Teja

3
describe YOUR_TABLE;

Nel tuo caso :

describe EVENT_LOG;

3

Per MySQL, utilizzare

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

3

Anche questo è anche uno dei modi in cui possiamo usarlo

select * from product where 1 != 1

2

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

Benvenuto su Stack Overflow @expert one. Anche se la tua risposta sembra essere accurata, ti preghiamo di aggiungere ulteriori dettagli e spiegazioni rispetto al "codice" juste. Sarebbe più chiaro per tutti.
Jean-Rémy Revy,

1

Potresti anche provare questo, ma potrebbero essere più informazioni di quelle necessarie:

sp_columns TABLE_NAME

1

mysql

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

Questo restituirà un risultato simile al seguente:

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

Quindi per estrarre i valori puoi semplicemente

fetch row[0]

Questo è ottimo anche per passare dinamicamente l'input poiché REGEXP ha bisogno di '|' per più input, ma è anche un modo per mantenere i dati separati e facili da archiviare / passare a classi / funzioni.

Prova a inserire dati fittizi anche per sicurezza quando li invii e confronta ciò che è stato restituito quando ricevi errori.


1

In Oracle, ci sono due viste che descrivono le colonne:

  • DBA_TAB_COLUMNS descrive le colonne di tutte le tabelle, viste e cluster nel database.

  • USER_TAB_COLUMNS descrive le colonne delle tabelle, delle viste e dei
    cluster di proprietà dell'utente corrente. Questa vista non visualizza la
    colonna PROPRIETARIO.


0

La risposta è qui: http://php.net/manual/en/function.mysql-list-fields.php Nel mio caso utilizzerei il seguente codice:

$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'];
    }
}

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

puoi eseguire questa query

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

Basta selezionare la prima riga dalla tabella, per Oracle: select * from <table name> where rownum = 1;


Cosa significa rownum? Devo usare una colonna chiamata rownum?
merve bıçakçı,

-1

Sono arrivato a questa domanda cercando l'accesso ai nomi delle colonne su Teradata, quindi aggiungerò la risposta per il loro "sapore" di SQL:

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

Le informazioni sono memorizzate nel dbase DBC.

Ottenere i tipi di dati è un po 'più coinvolto: ottieni il tipo di colonna usando le tabelle di sistema di teradata


-1

Prova questo

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


-3
SELECT COLUMN_NAME 
FROM YourDatabase.INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME = 'YourTableName'
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.