2012-04-03 8 views
36

Czy istnieje prosta alternatywa w PostgreSQL do tego oświadczenia opracowanego w Oracle?Jak mogę sprawdzić, czy kolumna istnieje w tabeli przy użyciu instrukcji SQL?

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

Następnie testuję, czy zapytanie zwraca wszystko, aby udowodnić, że kolumna istnieje.

Jestem świadomy, że używając psql mogę je znaleźć osobno, ale jest to wymagane do wytworzenia wyniku w programie, który piszę, aby potwierdzić, że pole z żądanym atrybutem istnieje w mojej tabeli bazy danych.

Odpowiedz

75

Spróbuj tego:

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

Dzięki. Zaakceptowana jako odpowiedź, jako bezpośrednia alternatywa dla tego, co robiłem w Oracle. – CSharpened

+0

działa w ten sam sposób na MySQL, co jest miłe. – Evgeny

+0

@C Zaostrzono, co jest kwerendą dla Oracle? – Evgeny

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

Oczywiście zastąpić YOURTABLENAME i YOURCOLUMNNAME z odpowiednimi wartościami. Jeśli zostanie zwrócony wiersz, istnieje kolumna o tej nazwie, w przeciwnym razie nie.

+0

Dzięki za odpowiedź. Chociaż twój przykład działa dobrze, zdecydowałem się przyjąć odpowiedź Ramandeeps ze względu na jego prostotę i fakt, że wydaje się bardziej bezpośrednią alternatywą dla mojego problemu. – CSharpened

13

To jest prostsze (i SQLi-safe) z 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) 

Przeczytaj o significance of the columns in the manual.

Jeśli budujesz dynamicznego SQL i nazwę kolumna jest dostarczany jako parametru, można użyć quote_ident() aby uniknąć wstrzyknięcia SQL:

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

działa dla tabel poza search_path też:

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

Akceptowane odpowiedź jest poprawna, ale brakuje schematu i ładniejszy wyjście (prawda/Fałsz):

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

Oto podobny wariant odpowiedzi Erwin Brandstetter. Tutaj sprawdzamy również schemat w przypadku, gdy mamy podobne tabele w innym schemacie.

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 
Powiązane problemy