2012-04-03 11 views
36

Esiste un'alternativa semplice in PostgreSQL a questa istruzione prodotta in Oracle?Come posso verificare se esiste una colonna in una tabella utilizzando un'istruzione SQL

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

Sto quindi verificare se la query restituisce qualsiasi cosa in modo da dimostrare esiste la colonna.

Sono consapevole che con psql posso trovarli singolarmente ma questo è necessario per produrre un risultato in un programma che sto scrivendo per convalidare che un campo di attributo richiesto esiste nella mia tabella di database.

risposta

75

Prova questa:

SELECT column_name 
FROM information_schema.columns 
WHERE table_name='your_table' and column_name='your_column'; 
+0

Grazie. Accettato come risposta in quanto è un'alternativa diretta a ciò che stavo facendo in Oracle. – CSharpened

+0

funziona allo stesso modo su MySQL, che è bello – Evgeny

+0

@CSharpened qual è la query per Oracle? – Evgeny

3
SELECT attname 
FROM pg_attribute 
WHERE attrelid = (SELECT oid FROM pg_class WHERE relname = 'YOURTABLENAME') 
AND attname = 'YOURCOLUMNNAME'; 

Naturalmente, sostituire YOURTABLENAME e YOURCOLUMNNAME con i valori corretti. Se viene restituita una riga, esiste una colonna con quel nome, altrimenti non lo fa.

+0

Grazie per la risposta. Sebbene il tuo esempio funzioni bene, ho scelto di accettare la risposta Ramandeep per la sua semplicità e il fatto che sembra un'alternativa più diretta al mio problema. – CSharpened

13

Questo è più semplice (e SQLI-safe) con PostgreSQL di object identifier types:

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) 

Maggiori informazioni su significance of the columns in the manual.

Se si sta costruendo SQL dinamico e il vostro nome della colonna viene fornito come parametro, si potrebbe desiderare di utilizzare quote_ident() per evitare SQL injection:

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

lavori per le tabelle di fuori del search_path, troppo:

... 
WHERE attrelid = 'mySchema.myTable'::regclass 
... 
16

risposta accettata è corretto, ma manca lo schema e l'uscita più bello (vero/Falso):

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

Ecco una variante simile della risposta di Erwin Brandstetter. Qui controlliamo anche lo schema nel caso in cui abbiamo tabelle simili in schemi diversi.

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