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.
Essaye ça :
SELECT column_name
FROM information_schema.columns
WHERE table_name='your_table' and column_name='your_column';
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');
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
...
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.
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
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