2017-12-01 22 views
0

にJSON配列に複数の行を変換:PostgreSQLは関係一対多に2つのテーブルがありjson_build_object

CREATE TABLE user (
    id bigserial PRIMARY KEY, 
    name varchar(255) NOT NULL UNIQUE, 
) 

CREATE TABLE user_pets (
    id bigserial PRIMARY KEY, 
    user_id int8 FOREIGN KEY REFERENCES user(id), 
    name varchar(255) 
) 

user.idDEFAULTによって生成されます。

ユーザーと自分のペットのJSONを含む別のテーブル:

CREATE TABLE user_json (
    user_id int8 FOREIGN KEY REFERENCES user(id), 
    full_info json 
) 

私は、JSONは次のようになりたい:

{ 
    "id": 1, 
    "name": "John", 
    "pets": [ 
    { 
     "id": 1, 
     "user": 1, 
     "name": "Kitty" 
    }, 
    { 
     "id": 2, 
     "user": 1, 
     "name": "Cat" 
    } 
    ] 
} 

私は、ユーザーを処理するためにjson_build_objectを使用していますが、私はしないでください複数の行をペットの配列に変換する方法を知っている:

json_build_object(
    'id', user.id, 
    'name', user.name, 
    'pets', --WHAT SHALL I PASS HERE? 
) 

Postgres 10

答えて

0

、これは私の仕事:

WITH all_pets AS (
    SELECT * 
    FROM pets 
    WHERE pets.user_id = 1 
) 
INSERT INTO user_json (full_info) 
SELECT 
json_build_object(
    'id', user.id, 
    'name', user.name, 
    'pets', (
    SELECT json_agg(all_pets) 
    FROM pets 
) 
) 
FROM user 
WHERE user.id = 1; 
0

あなたは(json_to_recordsetを使用することができます)、および横のJOIN CROSSを使用してJSONオブジェクトに適用されます。最後に

SELECT a.full_info->>'id', a.full_info->>'name', b.* 
FROM user_json a 
CROSS JOIN lateral json_to_recordset(a.full_info->'pets') 
as b("id" integer 
     , "user" integer 
     , "name" varchar) 
+0

を私はこれを通過したときに'json_build_object'関数に問い合わせると、' ERROR:サブクエリは1つのカラムだけを返す必要があります '。私はペットの配列を含むユーザーのjson情報が必要ですが、私はあなたのクエリにユーザーデータが表示されません。私は残念ですが、どうしたらいいのですか? – gorodkovskaya

+0

JSON文字列を挿入すると、インスタンス上で動作するので奇妙です:SELECT a.full_info - >> 'id'、a.full_info - >> 'name' 、B * 「{ "ID" SELECT(FROM:1、 "名前": "ジョン"、 "ペット":[ { "ID":1、 "ユーザ":1、 「名前「: "キティ" }、 { "ID":2、 "ユーザ":1、 "名前": "CAT" } ]} ':: CROSS)full_infoとしてJSONが横json_to_recordsetをJOIN (a.full_info - > 'pets') b( "id"の整数 、 "user"の整数 、 "name" varchar) – Breathe

関連する問題