将Array对象检查为WHERE子句的一部分

时间:2016-05-03 13:02:30

标签: postgresql-9.4 jsonb

我正在使用postgres 9.4和jsonb类型。我有下表:

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": "customer1@gmail.com"}}
{"date": "2015-12-01T00:00:00.000Z", "items": [{"name": "bottles", "price": 1}, {"name": "caps", "price": 50}], "customer": {"name": "Customer 2", "email": "customer2@gmail.com"}}

我想要的是获取所有具有价格大于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

谁能告诉我怎么做?是否可以为任意级别的嵌套执行此操作?

谢谢!

2 个答案:

答案 0 :(得分:0)

尝试这样的事情:

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

答案 1 :(得分:0)

Tyr this:

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

我要做的是:给我一些对象,其中元素项具有元素价格等于整数'1'的子对象。

在此处查看一些示例:http://schinckel.net/2014/05/25/querying-json-in-postgres/