以下を実行すると、"" record "を返す関数には列定義リストが必要です)を取得します。
_SELECT *
FROM json_to_record('{"a":1,"b":2,"c":3,"d":4}');
ERROR: a column definition list is required for functions returning "record"
LINE 1: SELECT * FROM json_to_record('{"a":1,"b":2,"c":3,"d":4}');
_
それはいいです。私はそれが何を望んでいるかを知っています。
_SELECT *
FROM json_to_record('{"a":1,"b":2,"c":3,"d":4}')
AS (a int, b int, c int, d int);
_
また、PostgreSQLでは、すべてのテーブルに同じ名前で作成されたタイプがすでにあります。
_CREATE TABLE foo(a,b,c,d)
AS VALUES
(1,2,3,4);
_
これにより、新しく作成されたテーブルfoo
にリンクされた内部タイプfoo
が作成されます。 bar
でも明示的に同様のタイプを簡単に作成できます。
_CREATE TYPE bar AS (a int, b int, c int, d int);
_
json_to_record()
から返されたレコードをbarにキャストできると便利です。
_SELECT *
FROM json_to_record('{"a":1,"b":2,"c":3,"d":4}')
AS foo; -- bar? anything?
_
とにかく型で列定義リストを満たすためにありますか?
使用する json_populate_record
:
SELECT *
FROM json_populate_record(null::foo, '{"a":1,"b":2,"c":3,"d":4}')
列の照合は名前で行われ、存在しない列は無視されます。
create type other_foo as (a int, b int, x int, y int):
SELECT *
FROM json_populate_record(null::other_foo, '{"a":1,"b":2,"c":3,"d":4}');
戻り値:
a | b
--+--
1 | 2