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.
6 réponses
essayez ceci:
SELECT column_name
FROM information_schema.columns
WHERE table_name='your_table' and column_name='your_column';
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');
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
...
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.
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
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