Comment puis-je obtenir des noms de colonnes à partir d'une table dans Oracle?


187

J'ai besoin d'interroger la base de données pour obtenir les noms de colonnes , à ne pas confondre avec les données de la table. Par exemple, si j'ai une table nommée EVENT_LOGqui contient eventID, eventType, eventDescet eventTime, je voudrais récupérer les noms de champs de la requête et rien d' autre.

J'ai trouvé comment faire cela dans:

Mais j'ai besoin de savoir: comment cela peut-il être fait dans Oracle ?

Réponses:


195

Vous pouvez interroger la table USER_TAB_COLUMNS pour les métadonnées de colonne de table.

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

21
Notez que cela est spécifique à Oracle.
ConcernedOfTunbridgeWells

9
Y a-t-il une raison pour laquelle cela pourrait renvoyer "aucune ligne sélectionnée"? (Dans Oracle.)
Ian R. O'Brien

11
Si vous n'avez «aucune ligne sélectionnée», vous pouvez essayer de passer USER_TAB_COLUMNSà all_tab_columns. Pour être sûr à 100% du résultat, vous pourriez le propriétaire épicé.
Dracontis

3
Vous pouvez ajouter "ORDER by column_id" au cas où vous voudriez les récupérer dans le même ordre qu'ils ont été créés dans la table. Voici quelques autres données de colonne pertinentes de la table docs.oracle.com/cd/B19306_01/server.102/b14237/…
Bernauer

2
Assurez-vous que le nom de la table est en majuscules.
Hugh Seagraves

67

Dans SQL Server ...

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

Type = 'V' pour les vues Type = 'U' pour les tables


39

Tu peux le faire:

describe EVENT_LOG

ou

desc EVENT_LOG

Remarque: applicable uniquement si vous connaissez le nom de la table et spécifiquement pour Oracle.


26

Pour SQL Server 2008, nous pouvons utiliser information_schema.columns pour obtenir des informations de colonne

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

1
Notez que les INFORMATION_SCHEMAtables sont les tables de métadonnées standard ANSI. Tout bon SGBDR moderne les aura.
Bacon Bits

19

Pour SQLite, je pense que vous pouvez utiliser quelque chose comme ce qui suit:

PRAGMA table_info(table-name);

Explication de sqlite.org:

Ce pragma renvoie une ligne pour chaque colonne de la table nommée. Les colonnes de l'ensemble de résultats incluent le nom de la colonne, le type de données, si la colonne peut être NULL ou non et la valeur par défaut de la colonne. La colonne "pk" du jeu de résultats est égale à zéro pour les colonnes qui ne font pas partie de la clé primaire et est l'index de la colonne dans la clé primaire pour les colonnes qui font partie de la clé primaire.

Voir aussi: Sqlite.org Pragma Table Info


1
Je ne sais pas non plus pourquoi j'ai été rejeté, mais je suis heureux que cela vous ait aidé.
shieldstroy

2
Elle a peut-être été rejetée car la question est étiquetée Oracle.
Burhan Ali

2
J'ai supprimé la balise Oracle et j'ai voté pour cela - j'ai pensé qu'il y avait tellement de réponses que cette question fonctionne mieux en tant que question générale. (Je suis venu ici à la recherche de celui de mySQL.)
icedwater

16

Ces informations sont stockées dans la ALL_TAB_COLUMNStable système:

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

DUMMY

Ou vous pouvez DESCRIBEutiliser la table si vous utilisez SQL * PLUS:

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

Documentation officielle ALL_TAB_COLUMNSvia la référence officielle de la base de données Oracle . Cette vue décrit les colonnes des tables, vues et clusters accessibles à l'utilisateur actuel.
M. Polywhirl

Mais nous ne pouvons pas donner le nom du schéma devant la table, non? par exemple si je veux comme ça select column_name from all_tab_columns where table_name = 'dbo.usertbl';
AhammadaliPK

9

Les autres réponses répondent suffisamment à la question, mais j'ai pensé partager des informations supplémentaires. D'autres décrivent la syntaxe "DESCRIBE table" afin d'obtenir les informations de la table. Si vous souhaitez obtenir les informations dans le même format, mais sans utiliser DESCRIBE, vous pouvez faire:

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

Cela n'a probablement pas beaucoup d'importance, mais je l'ai écrit plus tôt et cela semble convenir.


En essayant cela maintenant (des années plus tard) dans SQL Server 2008, j'obtiens une Incorrect Syntax near '|'erreur
Al Lelopath

4

Pour Oracle

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

4
describe YOUR_TABLE;

Dans ton cas :

describe EVENT_LOG;

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

cette requête fonctionne-t-elle, en spécifiant un nom de colonne et une étoile- "select nom_colonne, *" .. Cela ne fonctionne pas dans Oracle.
Teja

3

Pour MySQL, utilisez

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

3

Même c'est aussi l'une des façons dont nous pouvons l'utiliser

select * from product where 1 != 1

2

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

Bienvenue sur Stack Overflow @expert one. Même si votre réponse semble exacte, veuillez ajouter plus de détails et d'explications qu'un simple «code». Ce serait plus clair pour tout le monde.
Jean-Rémy Revy

1

Vous pouvez également essayer ceci, mais cela peut contenir plus d'informations que ce dont vous avez besoin:

sp_columns TABLE_NAME

1

Mysql

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

Cela renverra un résultat comme ceci:

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

Ensuite, pour extraire les valeurs, vous pouvez simplement

fetch row[0]

Ceci est également idéal pour passer des entrées dynamiquement car le REGEXP a besoin du '|' pour plusieurs entrées, mais c'est aussi un moyen de séparer les données et de les stocker / transmettre facilement aux classes / fonctions.

Essayez également de jeter des données factices pour la sécurité lors de leur envoi et comparez ce qui a été renvoyé lors de la réception d'erreurs.


1

Dans Oracle, deux vues décrivent les colonnes:

  • DBA_TAB_COLUMNS décrit les colonnes de toutes les tables, vues et clusters de la base de données.

  • USER_TAB_COLUMNS décrit les colonnes des tables, vues et
    clusters appartenant à l'utilisateur actuel. Cette vue n'affiche pas la
    colonne OWNER.


0

La réponse est ici: http://php.net/manual/en/function.mysql-list-fields.php J'utiliserais le code suivant dans votre cas:

$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

vous pouvez exécuter cette requête

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

Sélectionnez simplement la première ligne du tableau, pour oracle: select * from <table name> where rownum = 1;


Que signifie rownum? Dois-je utiliser une colonne nommée rownum?
merve bıçakçı

-1

Je suis tombé sur cette question à la recherche d'un accès aux noms de colonnes sur Teradata, je vais donc ajouter la réponse pour leur `` saveur '' de SQL:

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

Les informations sont stockées dans la base de données DBC.

Obtenir des types de données est un peu plus compliqué : obtenez le type de colonne à l'aide des tables système teradata


-1

Essaye ça

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'
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.