Найдите цену выше, чем при использовании операторов JSON
Aug 20 2020
Json:
"availability": [
{
"qty": 25,
"price": 3599,
"is_available": true
},
{
"qty": 72,
"price": 3599,
},
"is_available": true
]
Если я хочу найти цену со значением = " 3599 ", я использую этот запрос:
select *
from product
where to_tsvector(product.data #>> '{availability}') @@ to_tsquery('3599')
или этот запрос:
SELECT *
FROM product
WHERE product.data @> '{"availability": [ { "price": 3599} ] }';
Ницца. Работает нормально.
Но мне также нужно найти цену> 1000
Я пробую это:
select *
from product
where to_tsvector(product.data #>> '{availability}') @@ to_tsquery('>1000')
Но результат пустой (ничего не найдено).
Ответы
3 a_horse_with_no_name Aug 20 2020 at 12:33
Полнотекстовый поиск - неподходящий инструмент для такого рода запросов.
В Postgres 12 вы можете использовать выражение JSON / Path:
select *
from product
where data @@ '$.availability[*].price > 100';
Для более старых версий Postgres вам необходимо отключить массив:
select *
from product
where exists (select *
from jsonb_array_elements(data -> 'availability') as x(item)
where (x.item ->> 'price')::int > 100);