web-dev-qa-db-ja.com

列定義リストの代わりにタイプを使用していますか?

以下を実行すると、"" 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?
_

とにかく型で列定義リストを満たすためにありますか?

4
Evan Carroll

使用する 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