Проверить объект массива как часть предложения WHERE

Я использую 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": "[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

Кто-нибудь может сказать мне, как это сделать? Возможно ли это сделать для произвольного уровня вложенности?

Спасибо!


person shortspider    schedule 03.05.2016    source источник


Ответы (2)


Попробуйте что-то вроде этого:

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

person Jehy    schedule 11.05.2016
comment
Это работает и как дополнительное преимущество предоставления самих элементов элементов. Интересно, может ли это быть вложенным? Если бы у меня был массив объектов, у которого также был бы массив объектов, как бы они были запрошены? - person shortspider; 12.05.2016
comment
@shortspider попробуйте этот пример: /32571338/ - person Jehy; 13.05.2016

Ты это:

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

Что я пытаюсь сделать, так это: дать мне объекты, в которых элементы элементов имеют дочерний объект, цена элемента которого равна целому числу «1».

ознакомьтесь с некоторыми примерами здесь: http://schinckel.net/2014/05/25/querying-json-in-postgres/

person Murlidhar Fichadia    schedule 12.05.2016
comment
Это не дает мне никаких результатов, даже если я изменю сравнение на › '0' - person shortspider; 12.05.2016
comment
у меня опечатка jsonb_test после FROM. попробуй и увидишь - person Murlidhar Fichadia; 12.05.2016
comment
Я сделал и все еще ничего. Вот запрос: SELECT * FROM jsonb_test WHERE jsonb_test.data #> '{items,price}' > '0'; - person shortspider; 12.05.2016