web-dev-qa-db-fra.com

Comment puis-je tester si une colonne existe dans une table à l'aide d'une instruction SQL

Existe-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 ensuite si la requête renvoie quelque chose afin de prouver que la colonne existe.

Je suis conscient qu'en utilisant psql, je peux les trouver 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.

49
CSharpened

Essaye ça :

SELECT column_name 
FROM information_schema.columns 
WHERE table_name='your_table' and column_name='your_column';
100
Ramandeep Singh

La réponse acceptée est correcte, mais il manque le schéma et une sortie plus agréable (Vrai/Faux):

SELECT EXISTS (SELECT 1 
FROM information_schema.columns 
WHERE table_schema='my_schema' AND table_name='my_table' AND column_name='my_column');
28
juan Isaza

C'est plus simple (et SQLi-safe) avec les PostgreSQL types d'identifiant d'objet :

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)

Lisez à propos de signification des colonnes dans le manuel .

Si vous créez du SQL dynamique et que le nom de votre colonne est fourni en tant que paramètre, vous souhaiterez peut-être utiliser quote_ident() pour éviter l'injection SQL:

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

Fonctionne également pour les tables en dehors du search_path:

...
WHERE  attrelid = 'mySchema.myTable'::regclass
...
14
SELECT attname 
FROM pg_attribute 
WHERE attrelid = (SELECT oid FROM pg_class WHERE relname = 'YOURTABLENAME') 
AND attname = 'YOURCOLUMNNAME';

Bien sûr, remplacez VOTRE NOM DE TABLE et VOTRE NOM DE COLONNE avec les valeurs appropriées. Si une ligne est retournée, une colonne portant ce nom existe, sinon ce n'est pas le cas.

3
aleroot

Contrairement à Oracle, PostgreSQL prend en charge la norme ANSI INFORMATION_SCHEMA vues.

La vue standard correspondante des colonnes_utilisateur_tab d'Oracle est information_schema.columns

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

3

Voici une variante similaire de la réponse d'Erwin Brandstetter. Ici, nous vérifions également le schéma au cas où nous aurions des tables similaires dans des schémas différents.

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
user2434435