2012-04-03 6 views
36

Oracleで作成されたこの文には、PostgreSQLに単純な代替手段はありますか?SQL文を使用してテーブルにカラムが存在するかどうかをテストするには

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

次に、クエリが何かを返して列が存在することを証明するかどうかをテストします。

私はこれらを個別に見つけることができることを知っていますが、これは要求された属性フィールドがデータベーステーブルに存在することを検証するために書いているプログラムで結果を生成するために必要です。もちろん

答えて

75

あり、これを試してみてください:

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

ありがとうございます。私がオラクルでやっていたことの直接的な代替手段であるので、答えとして受け入れられます。 – CSharpened

+0

はMySQLで同じように動作します。これは素晴らしいです – Evgeny

+0

@CSharpened Oracleのクエリは何ですか? – Evgeny

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

、適切な値でYOURTABLENAMEYOURCOLUMNNAMEを交換してください。行が返された場合は、その名前の列が存在し、存在しない場合は存在しません。

+0

お返事ありがとうございます。あなたの例はうまくいきますが、私はRamandeepsの答えを受け入れることを選択しました。その単純さと、それが私の問題のより直接的な選択肢であるという事実のためです。 – CSharpened

13

これは単純に(とSQLIセーフ)である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) 

significance of the columns in the manualについて読む。

あなたは、動的SQLを構築しているし、あなたのカラム名をパラメータとして指定されている場合は、SQLインジェクションを防ぐためにquote_ident()を使用する場合がありますが:あまりにsearch_path外のテーブルの

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

ワークス:

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

受け入れられる回答は正しいですが、スキーマとより良い出力(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'); 
0

これは、Erwin Brandstetterの回答と同様の変形です。 異なるスキーマに類似したテーブルがある場合に備えて、ここでもスキーマをチェックします。

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 
関連する問題