2017-09-18 5 views
0

私はJSON/JSONBデータ型が新しく、より深いレベルからJSONB要素を選択する際にいくつか問題があります。ここでPostgreSQLのネストされたJSONBをより深いレベルでクエリする方法は?

は、例えばテーブルである:

CREATE TABLE person (id integer, details jsonb); 

INSERT INTO person (id, details) VALUES 
("id": 1, {"favorites":{"colors":"blue", "colors":"red"}}), 
("id": 2), 
("id": 3, {"favorites":{"colors":"blue", "colors":"red", "colors":"green"}}); 


私はすべてのp.detailsを選択したい - > 'お気に入り' - >> '色'、例えば:

------------------------ 
| id | Favorite colors | 
------------------------ 
| 1 | blue   | 
------------------------ 
| 1 | red    | 
------------------------ 
| 3 | blue   | 
------------------------ 
| 3 | red    | 
------------------------ 
| 3 | green   | 
------------------------ 


を次の(または類似)は、好きな色の列を空にします(jsonb_array_elementsでも試しました)。

SELECT p.id, p.details ->'favorites' ->>'colors' AS "Favorite colors" 
FROM "person" p; 

SELECT p.id, json_array_elements((p.details ->'favorites' ->>'colors')::json) AS "Favorite colors" 
FROM "person" p; 


以下は単純なクエリで動作しますが、より多くのデータを取得するとブラウザがクラッシュします(エンドユーザーはWebブラウザでクエリを使用します)。

SELECT p.id, ((json_array_elements((json_array_elements(p.details::json)::json->>'favorites')::json))::json->>'colors') AS "Favorite colors" 
    FROM "person" p; 

ブラウザがメモリを大量に消費しているようです。 json_array_elementsを複数回呼び出すと、クエリが遅くなるという記事があります。https://www.postgresql.org/message-id/[email protected]

これに関するアドバイスはありますか?

+0

:これはあなたが経由で結果を得ることができるよりも正しい場合

DROP TABLE person; CREATE TABLE person (id integer, details jsonb); INSERT INTO person (id, details) VALUES (1, '{"favorites":[{"colors":"blue"}, {"colors":"red"}]}'::jsonb), (2, '{}'::jsonb), (3, '{"favorites":[{"colors":"blue"}, {"colors":"red"}, {"colors":"green"}]}'::jsonb); 

? Firefox?クロム?そして、そのブラウザのクエリの結果をどのように表示しますか?どのプログラミング言語を使用していますか?そして、「ブラウザをクラッシュさせる」ということは、正確にはどういう意味ですか?あなたのブラウザに表示するデータ量を減らそうとしましたか?ブラウザのメモリ消費量は、PostgreSQLサーバのメモリ消費量とは関係ありません。 「説明する(分析する、バッファする)」はあなたにそれらのクエリを表示しますか? –

答えて

0

提供したSQLクエリに構文エラーがあります。 私は正しくこのようになり、彼らが必要以上DBスキーマを推測した場合:「ブラウザ」は、あなたが参照している何

select id, jsonb_array_elements(details->'favorites')->'colors' from person 
関連する問題