2017-11-11 25 views
0

配列に入れ子になったオブジェクトでjson列が埋め込まれたpostgresql表があります。今は、json列のオブジェクトのidと連結された文字列値を返すクエリを作成します。 PostgreSQLのバージョンは9.5です。postgresql json配列のオブジェクトの文字列値を連結する

例データ

CREATE TABLE test 
(
    id integer, 
    data json 
); 

INSERT INTO test (id, data) VALUES (1, '{ 
    "info":"a", 
    "items":[ 
     { "name":"a_1" }, 
     { "name":"a_2" }, 
     { "name":"a_3" } 
    ] 
}'); 

INSERT INTO test (id, data) VALUES (2, '{ 
    "info":"b", 
    "items":[ 
     { "name":"b_1" }, 
     { "name":"b_2" }, 
     { "name":"b_3" } 
    ] 
}'); 

INSERT INTO test (id, data) VALUES (3, '{ 
    "info":"c", 
    "items":[ 
     { "name":"c_1" }, 
     { "name":"c_2" }, 
     { "name":"c_3" } 
    ] 
}'); 

はかなり意図一例として機能していない

これまでのところ私は1つに追加された文字列をなし、残念ながら、テーブルから値を取得することができました別の出力されます

SELECT 
    row.id, 
    item ->> 'name' 
FROM 
    test as row, 
    json_array_elements(row.data #> '{items}') as item; 

id | names 
---------- 
1 | a_1 
1 | a_2 
1 | a_3 
2 | b_1 
2 | b_2 
2 | b_3 
3 | c_1 
3 | c_2 
3 | c_3 

意図した出力例が

どのようにクエリはそのようになりますが、この出力を返しますか?配列に第二列のSQLを変更することにより

id | names 
---------- 
1 | a_1, a_2, a_3 
2 | b_1, b_2, b_3 
3 | c_1, c_2, c_3 

SQL Fiddle link

+0

キーの順序付けと間隔のようなJSONの詳細を取得する必要がない限り、JSONBタイプが優先されることに注意してください。 JSONはJSONの正確なテキストコピーを保存し、JSONBはより効率的なバイナリ形式で保存します。 https://www.postgresql.org/docs/9.5/static/datatype-json.html – Schwern

+0

ヒントをお寄せいただきありがとうございます。実際のデータはjsonbです。例はjsonです。私が知る限り、jsonとjsonbの列の型は同じです。 – Simono

+0

ヒント: 'string_agg' https://www.postgresql.org/docs/9.5/static/functions-aggregate.html – jcaron

答えて

0

あなたの元の試みはステップ

によってグループが欠落し

これが動作するはずです:

SELECT 
    id 
    , STRING_AGG(item->>'name', ', ') 
FROM 
    test, 
    json_array_elements(test.data->'items') as item 
GROUP BY 1 
+0

ありがとうございました! – Simono

0

は、必要な結果が得られなければならない....

SELECT 
    row.id, ARRAY (SELECT item ->> 'name' 
FROM 
    test as row1, 
    json_array_elements(row.data #> '{items}') as item WHERE row.id=row1.id) 

FROM 
    test as row; 
+0

ご回答いただきありがとうございます。残念ながら、2番目の列は配列ではなく1つの文字列にする必要があります。 – Simono