やりたい
select col1, col2 from foo union values (null, null)
しかしnull
、デフォルトのタイプの TEXT が与えられているため、「UNION タイプ [eg] 整数とテキストを一致させることはできません」というエラーが表示されます。特定のケースでは、foo の列の型を提供できますが、プログラムで SQL ステートメントを作成しているため、列の型情報を持ち歩く必要がない方が望ましいでしょう。
これに対する回避策はありますか?
やりたい
select col1, col2 from foo union values (null, null)
しかしnull
、デフォルトのタイプの TEXT が与えられているため、「UNION タイプ [eg] 整数とテキストを一致させることはできません」というエラーが表示されます。特定のケースでは、foo の列の型を提供できますが、プログラムで SQL ステートメントを作成しているため、列の型情報を持ち歩く必要がない方が望ましいでしょう。
これに対する回避策はありますか?
次のようなクエリを使用してINFORMATION_SCHEMA
テーブルをクエリできます。COLUMNS
SELECT column_name, data_type
FROM information_schema.columns
WHERE table_name = 'mytable'
または、PostgreSQL 固有のフォームを使用できます。
SELECT attname, atttypid::regtype
FROM pg_attribute
WHERE attrelid = 'public.mytable'::regclass
AND attnum > 0
これにより、テーブル内の対象の列のデータ型が得られます。これにより、自動化されたフレームワークで、次UNION
のように NULL を必要なデータ型にキャストすることで、空の行を追加する文字列を生成できます。
SELECT col1, col2 FROM foo
UNION ALL VALUES (NULL::VARCHAR, NULL::INTEGER)
おそらくもっと重要な質問は、なぜ空の行が必要なのですか? おそらく、この合成の空の行を最初から持たなくてもうまくいくのではないでしょうか?
col1 が bar 型で、col2 が baz 型の場合
select col1, col2 from foo union values (null::bar, null::baz)
動作します
実際には、NULL を int にキャストできますが、空の文字列を int にキャストすることはできません。data1 に空の文字列または NULL が含まれている場合、新しい列に NULL が必要であると仮定すると、次のようなことができます。
UPDATE table SET data2 = cast(nullif(data1, '') AS int);
また
UPDATE table SET data2 = nullif(data1, '')::int;