2016-08-18 7 views
3

でJSONオブジェクトから値Iはこれに類似したコンテンツを有するPostgresのテーブルを有する:抽出キー、Postgresの

id | data 

1 | {"a":"4", "b":"5"} 
2 | {"a":"6", "b":"7"} 
3 | {"a":"8", "b":"9"} 

最初の列は整数であり、第二は、JSONカラムです。

私は結果は次のようになりますので、JSONのキーと値を拡張できるようにしたい:

id | key | value 

1 | a | 4 
1 | b | 5 
2 | a | 6 
2 | b | 7 
3 | a | 8 
3 | b | 9 

これはPostgresのSQLで達成することができますか?元のテーブルのようなシミュレートすることができることを私は考える

を試してみた何


select * 
from 
(
values 
(1, '{"a":"4", "b":"5"}'::json), 
(2, '{"a":"6", "b":"7"}'::json), 
(3, '{"a":"8", "b":"9"}'::json) 
) as q (id, data) 

私が使用してちょうどキーを入手することができます

select id, json_object_keys(data::json) 
from 
(
values 
(1, '{"a":"4", "b":"5"}'::json), 
(2, '{"a":"6", "b":"7"}'::json), 
(3, '{"a":"8", "b":"9"}'::json) 
) as q (id, data) 

そして私はそれらを次のようなレコードセットとして得ることができます:

select id, json_each(data::json) 
from 
(
values 
(1, '{"a":"4", "b":"5"}'::json), 
(2, '{"a":"6", "b":"7"}'::json), 
(3, '{"a":"8", "b":"9"}'::json) 
) as q (id, data) 

しかし、私はid、key、valueを使ってどのように結果を達成するかを考え出すことができません。

アイデア?

注:私が実際に使っているjsonは、これよりかなりネストされていますが、この例は私の根底にある問題をよく表していると思います。

+0

[postgresql 9.4 jsonbを関数/サーバー側の言語を持たないオブジェクトに変換する方法](http://stackoverflow.com/questions/27181980/how-to-convert-postgresql-9-4-jsonb-to -jject-function-server-side-langu) – e4c5

+0

カラムとしてではなく、テーブルとして 'json_object_keys'または' json_each'関数を使用してください: 'select id、j.key、j.value from my_table、json_each(data)j' – Abelisto

+0

ありがとうAbelisto。確かに、あなたが提案するクエリを使って、私が探しているテーブルではなく、完全なデカルト製品で終わるだろうか? –

答えて

6
SELECT q.id, d.key, d.value 
FROM q 
JOIN json_each_text(q.data) d ON true 
ORDER BY 1, 2; 

関数json_each_text()は、関数を返す関数であるため、行ソースとして使用する必要があります。この関数の出力は、テーブルqに対してjoined laterallyとなります。つまり、テーブルの各行について、data列の各(key, value)のペアは、元の行とjsonオブジェクトから形成された行との関係維持されています。

テーブルqは、非常に複雑なサブクエリ(またはご質問のようにVALUES句)でもかまいません。この関数では、サブクエリの評価結果から適切なカラムが使用されるため、サブクエリのエイリアスとサブクエリのカラム(エイリアス)への参照のみを使用します。

+0

ありがとうパトリック。私は元のクエリの周りにこれをどのように適合させるかについて、まだ少し混乱しています。私は 'WITH'ステートメントを使って 'q'を定義しますか? –

+0

WITHステートメントなしで達成できますか? –

+0

'q'はあなたが参照していたテーブルで、元のテーブルのプロキシとして使用しました。 – Patrick

関連する問題