64

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

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

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

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

4

6 に答える 6

130

これを試して :

SELECT column_name 
FROM information_schema.columns 
WHERE table_name='your_table' and column_name='your_column';
于 2012-04-03T10:05:08.180 に答える
46

受け入れられた答えは正しいですが、スキーマとより良い出力(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');
于 2015-12-29T20:33:29.290 に答える
21

これは、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を構築していて、列名がパラメーターとして指定されている場合はquote_ident()、SQLインジェクションを回避するために使用することをお勧めします。

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

の外のテーブルでも機能search_pathします:

...
WHERE  attrelid = 'mySchema.myTable'::regclass
...
于 2012-04-03T22:29:05.430 に答える
5

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

Oracleのuser_tab_columnsに対応する標準ビューは次のとおりです。information_schema.columns

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

于 2012-04-03T10:04:23.087 に答える
3
SELECT attname 
FROM pg_attribute 
WHERE attrelid = (SELECT oid FROM pg_class WHERE relname = 'YOURTABLENAME') 
AND attname = 'YOURCOLUMNNAME';

もちろん、YOURTABLENAMEYOURCOLUMNNAMEを適切な値に置き換えてください。行が返される場合、その名前の列が存在します。それ以外の場合は存在しません。

于 2012-04-03T10:04:06.320 に答える
2

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

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
于 2016-10-10T04:41:27.083 に答える