2016-05-03 13 views
3

私は、postgres 9.4とjsonbタイプを使用しています。WHERE句の一部として配列オブジェクトをチェックします。

CREATE TABLE jsonb_test (iid serial NOT NULL, data jsonb) 

そしてそのテーブルに次のJSONデータ:私は、次の表持って私がやりたい何

{"date": "2016-01-01T00:00:00.000Z", "items": [{"name": "bottles", "price": 12}, {"name": "caps", "price": 20}], "customer": {"name": "Customer 1", "email": "[email protected]"}} 
{"date": "2015-12-01T00:00:00.000Z", "items": [{"name": "bottles", "price": 1}, {"name": "caps", "price": 50}], "customer": {"name": "Customer 2", "email": "[email protected]"}} 

は価格でアイテムを持っているすべての行を取得することですが30より大きいこの場合、顧客2行が返されます。

これは、これまでのところ、私のクエリです:

SELECT * FROM jsonb_test WHERE jsonb_array_elements(jsonb_extract_path(data, 'items')) #> '{price}' > '0' 

しかし、これはエラーERROR: argument of WHERE must not return a set

で失敗する誰もがこれを行う方法を教えてもらえますか?任意のレベルのネストに対してこれを行うことは可能ですか?

ありがとうございます!

+0

あなたは[?なぜ私はj​​sonb_array_elementsに直接照会することはできません]読みました(http://stackoverflow.com/questions/30687945/why-cant-i-query-directly -on-jsonb-array-elements) – abarisone

+0

@abarisone私はそれを見ました。私には分かりませんでした。 – shortspider

答えて

0

このような何か試してみてください:この

SELECT * FROM jsonb_test, jsonb_array_elements(jsonb_test.data->'items') AS a WHERE (a->>'price') > '0'

+0

これは機能し、items要素自体を提供するという追加の利点として機能します。私は思っています、これは入れ子にすることができますか?オブジェクトの配列を持っているオブジェクトの配列を持っていたら、それらのオブジェクトはどのようにクエリされますか? – shortspider

+0

@shortspiderこの例を試してみてくださいhttp://stackoverflow.com/questions/32571338/postgres-jsonb-query-on-nested-object – Jehy

+0

これは完璧に見えます、ありがとうございます! – shortspider

0

のTyrを:私が何をしようとしています何

SELECT * FROM json_test WHERE jsonb_test.data #> '{items,price}' > '30'; 

がある:私の要素項目は要素の価格を持っている子オブジェクトを持つオブジェクトを与えます整数 '1'に等しい。

チェックアウトここにいくつかの例:http://schinckel.net/2014/05/25/querying-json-in-postgres/

+0

比較結果が> '0'に変更された場合でも、結果は返されません – shortspider

+0

FROMの後に誤ってjsonb_testがあります。試してみて –

+0

私はまだ何もしませんでした。 'SELECT * FROM jsonb_test WHERE jsonb_test.data#> '{items、price}'> '0';' – shortspider

関連する問題