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 ?

Paxenos
la source

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'
baretta
la source
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

Eppz
la source
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.

Sergey Golovchenko
la source
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  
Jom
la source
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

bouclier
la source
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)
Jon Ericson
la source
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.

Sasha
la source
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');
jampez77
la source
4
describe YOUR_TABLE;

Dans ton cas :

describe EVENT_LOG;
Rohit
la source
3
select column_name,* from information_schema.columns
 where table_name = 'YourTableName'
order by ordinal_position

la source
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'
ssamuel68
la source
3

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

select * from product where 1 != 1
JaiSankarN
la source
2

Pour SQL Server:

SELECT [name] AS [Column Name]
FROM syscolumns
WHERE id = object_id('TABLE_NAME')
bstricks
la source
2
SELECT COLUMN_NAME 'all_columns' 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME='user';
expert un
la source
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
WEFX
la source
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.

Dbo
la source
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.

Renaud Kern
la source
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'];
    }
}
user2558588
la source
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'
Henri
la source
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;
Etibar Hasanov
la source
-1

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

ciel bleu
la source
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

carnust
la source
-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%'
copains17
la source
-3
SELECT COLUMN_NAME 
FROM YourDatabase.INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME = 'YourTableName'
user3655399
la source