2012-04-03 3 views
36

Gibt es in PostgreSQL eine einfache Alternative zu dieser in Oracle erzeugten Anweisung?Wie kann ich testen, ob eine Spalte in einer Tabelle mit einer SQL-Anweisung existiert

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

-I-Tests sind dann, ob die Abfrage etwas zurückgibt, um die Spalte existiert zu beweisen.

Ich bin mir bewusst, dass mit psql ich diese einzeln finden kann, aber dies ist erforderlich, um ein Ergebnis in einem Programm zu erzeugen Ich schreibe zu validieren, dass ein angefordertes Attributfeld in meiner Datenbanktabelle existiert.

Antwort

75

Try this:

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

Danke. Akzeptiert als Antwort, da es eine direkte Alternative zu dem ist, was ich in Oracle gemacht habe. – CSharpened

+0

funktioniert auf die gleiche Weise auf MySQL, das ist nett – Evgeny

+0

@CSharpened, was ist die Abfrage für Oracle? – Evgeny

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

Natürlich ersetzen YOURTABLENAME und YOURCOLUMNNAME mit den richtigen Werten. Wenn eine Zeile zurückgegeben wird, existiert eine Spalte mit diesem Namen, andernfalls nicht.

+0

Danke für die Antwort. Obwohl Ihr Beispiel gut funktioniert, habe ich mich entschieden, die Antwort von Ramandeeps zu akzeptieren, aufgrund seiner Einfachheit und der Tatsache, dass es eine direktere Alternative zu meinem Problem scheint. – CSharpened

13

Das ist einfacher (und SQLi sicher) mit PostgreSQL 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) 

Lesen Sie über die significance of the columns in the manual.

Wenn Sie bauen wird dynamische SQL und Ihre Spaltennamen als Parameter angegeben, können Sie quote_ident() verwenden SQL-Injection zu vermeiden:

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

Arbeiten für Tische außerhalb des search_path auch:

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

akzeptierte Antwort ist richtig, aber ist das Schema und schönere Ausgabe (True/false) fehlt:

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

Hier ist eine ähnliche Variante von Erwin Brandstetter zu beantworten. Hier überprüfen wir auch Schema, wenn wir ähnliche Tabellen in verschiedenen Schemas haben.

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