11

関数を作成せず、サーバー側のプログラミング言語を使用せずに、postgresql 9.4 jsonb データを変換することは可能ですか?

CREATE TABLE test (id SERIAL PRIMARY KEY,data JSONB);
INSERT INTO test(data) VALUES('{"a":1,"b":2}');
INSERT INTO test(data) VALUES('{"a":3,"b":4,"c":7}');
INSERT INTO test(data) VALUES('{"a":5,"b":5,"d":8}');
SELECT * FROM test;
 id |           data       
----+-------------------------
  1 | {"a": 1, "b": 2}
  2 | {"a": 3, "b": 4, "c": 7}
  3 | {"a": 5, "b": 5, "d": 8}

それを次のように変換します。

 {1:[1,2,null,null],2:[3,4,7,null],3:[5,5,null,8]}
4

2 に答える 2

15

既知の行タイプをターゲットとしてjsonb_populate_record()(またはjson_populate_record()for ) を使用します。json一時テーブルを使用して、アドホック使用の型を登録できます (既存のテーブルまたはカスタム複合型を使用できない場合)。

CREATE TEMP TABLE obj(a int, b int, c int, d int);

それで:

SELECT t.id, d.*
FROM   test t
     , jsonb_populate_record(null::obj, t.data) d;

またはjsonb_to_record()(またはjson_to_record()for ) を使用jsonして、次の呼び出しで列定義リストを提供します。

SELECT t.id, d.*
FROM   test t
     , jsonb_to_record(t.data) d(a int, b int, c int, d int);

または、各フィールドを個別に抽出してキャストします。

SELECT id, (data->>'a')::int AS a, (data->>'b')::int AS b
         , (data->>'c')::int AS c, (data->>'d')::int AS d
FROM   test;

3つすべてが同じように機能jsonjsonbます。それぞれの関数バリアントを使用するだけです。

関連している:

于 2014-11-28T06:29:55.747 に答える