web-dev-qa-db-ja.com

SQLステートメントを使用してテーブルに列が存在するかどうかをテストする方法

Oracleで作成されたこのステートメントに対するPostgreSQLの簡単な代替手段はありますか?

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

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

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

49
CSharpened

これを試して :

SELECT column_name 
FROM information_schema.columns 
WHERE table_name='your_table' and column_name='your_column';
100
Ramandeep Singh

受け入れられた答えは正しいですが、スキーマとより良い出力がありません(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');
28
juan Isaza

これは、PostgreSQLの オブジェクト識別子のタイプ を使用してよりシンプル(かつSQLiセーフ)です。

_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)
_

マニュアルの列の意味 について読んでください。

動的SQLを構築していて、列名がパラメーターとして提供されている場合、SQLインジェクションを回避するために quote_ident() を使用できます。

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

_search_path_外のテーブルでも動作します:

_...
WHERE  attrelid = 'mySchema.myTable'::regclass
...
_
14
SELECT attname 
FROM pg_attribute 
WHERE attrelid = (SELECT oid FROM pg_class WHERE relname = 'YOURTABLENAME') 
AND attname = 'YOURCOLUMNNAME';

もちろん、[〜#〜] yourtablename [〜#〜][〜#〜] yourcolumnname [〜#〜]を置き換えます適切な値で。行が返される場合、その名前の列が存在しますが、そうでない場合は存在しません。

3
aleroot

Oracleとは異なり、PostgreSQLはANSI標準のINFORMATION_SCHEMAビューをサポートしています。

Oracleのuser_tab_columnsに対応する標準ビューはinformation_schema.columnsです

http://www.postgresql.org/docs/current/static/infoschema-columns.html

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
1
user2434435