Oracleで作成されたこのステートメントに対するPostgreSQLの簡単な代替手段はありますか?
select table_name from user_tab_columns
where table_name = myTable and column_name = myColumn;
次に、列が存在することを証明するために、クエリが何かを返すかどうかをテストしています。
私はpsqlを使用してこれらを個別に見つけることができることを知っていますが、要求された属性フィールドがデータベーステーブルに存在することを検証するために書いているプログラムで結果を生成するために必要です。
これを試して :
SELECT column_name
FROM information_schema.columns
WHERE table_name='your_table' and column_name='your_column';
受け入れられた答えは正しいですが、スキーマとより良い出力がありません(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');
これは、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
...
_
SELECT attname
FROM pg_attribute
WHERE attrelid = (SELECT oid FROM pg_class WHERE relname = 'YOURTABLENAME')
AND attname = 'YOURCOLUMNNAME';
もちろん、[〜#〜] yourtablename [〜#〜]と[〜#〜] yourcolumnname [〜#〜]を置き換えます適切な値で。行が返される場合、その名前の列が存在しますが、そうでない場合は存在しません。
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