Comment puis-je tester si une colonne existe dans une table en utilisant une déclaration SQL

y a-t-il une alternative simple dans PostgreSQL à cette déclaration produite dans Oracle?

select table_name from user_tab_columns
where table_name = myTable and column_name = myColumn;

je teste alors si la requête renvoie quelque chose afin de prouver l'existence de la colonne.

je sais qu'en utilisant psql je peux trouver ces derniers individuellement, mais cela est nécessaire pour produire un résultat dans un programme que j'écris pour valider qu'un champ d'attribut demandé existe dans ma table de base de données.

43
demandé sur GEOCHET 2012-04-03 14:01:57

6 réponses

essayez ceci:

SELECT column_name 
FROM information_schema.columns 
WHERE table_name='your_table' and column_name='your_column';
84
répondu Ramandeep Singh 2012-04-03 10:05:08

Accepté réponse est correcte, mais manque le schéma et le plus agréable de sortie (True/False):

SELECT EXISTS (SELECT 1 
FROM information_schema.columns 
WHERE table_schema='my_schema' AND table_name='my_table' AND column_name='my_column');
24
répondu juan Isaza 2015-12-29 20:33:29

c'est plus simple (et SQLi-safe) avec les type d'identificateur d'objet de PostgreSQL:

SELECT TRUE
FROM   pg_attribute 
WHERE  attrelid = 'myTable'::regclass  -- cast to a registered class (table)
AND    attname = 'myColumn'
AND    NOT attisdropped  -- exclude dropped (dead) columns
-- AND attnum > 0        -- exclude system columns (you may or may not want this)

lire à propos de la signification des colonnes dans le manuel .

si vous construisez du SQL dynamique et que votre nom de colonne est fourni comme paramètre, vous pouvez utiliser quote_ident() pour éviter l'injection de SQL:

...
AND    attname = quote_ident('myColumn');

Oeuvres pour tables en dehors du search_path , aussi:

...
WHERE  attrelid = 'mySchema.myTable'::regclass
...
14
répondu Erwin Brandstetter 2012-04-03 22:29:05
SELECT attname 
FROM pg_attribute 
WHERE attrelid = (SELECT oid FROM pg_class WHERE relname = 'YOURTABLENAME') 
AND attname = 'YOURCOLUMNNAME';

bien sûr, remplacer votre nom D'utilisateur et votre nom D'utilisateur par les valeurs appropriées. Si une ligne est retournée, une colonne avec ce nom existe, sinon elle n'existe pas.

3
répondu aleroot 2012-04-03 10:04:06

contrairement à Oracle, PostgreSQL supporte la norme ANSI INFORMATION_SCHEMA vues.

la vue standard correspondante à L'user_tab_columns D'Oracle est information_schema.columns

http://www.postgresql.org/docs/current/static/infoschema-columns.html

3
répondu a_horse_with_no_name 2012-04-03 10:04:23

Voici une variante similaire de la réponse D'Erwin Brandstetter. Ici, nous vérifions le schéma aussi dans le cas où nous avons des tables semblables dans le schéma différent.

SELECT TRUE FROM pg_attribute 
WHERE attrelid = (
    SELECT c.oid
    FROM pg_class c
    JOIN pg_namespace n ON n.oid = c.relnamespace
    WHERE 
        n.nspname = CURRENT_SCHEMA() 
        AND c.relname = 'YOURTABLENAME'
    )
AND attname = 'YOURCOLUMNNAME'
AND NOT attisdropped
AND attnum > 0
1
répondu user2434435 2016-10-10 04:41:27