Trova un prezzo maggiore rispetto all'utilizzo di operatori JSON
Aug 20 2020
Json:
"availability": [
{
"qty": 25,
"price": 3599,
"is_available": true
},
{
"qty": 72,
"price": 3599,
},
"is_available": true
]
Se voglio trovare il prezzo con valore = " 3599 ", utilizzo questa query:
select *
from product
where to_tsvector(product.data #>> '{availability}') @@ to_tsquery('3599')
o questa query:
SELECT *
FROM product
WHERE product.data @> '{"availability": [ { "price": 3599} ] }';
Bello. Funziona bene.
Ma devo anche trovare il prezzo> 1000
Provo questo:
select *
from product
where to_tsvector(product.data #>> '{availability}') @@ to_tsquery('>1000')
Ma il risultato è vuoto (non è stato trovato nulla).
Risposte
3 a_horse_with_no_name Aug 20 2020 at 12:33
La ricerca a testo completo è lo strumento sbagliato per questo tipo di query.
Con Postgres 12, puoi utilizzare un'espressione JSON / Path:
select *
from product
where data @@ '$.availability[*].price > 100';
Per le versioni precedenti di Postgres è necessario disattivare l'array:
select *
from product
where exists (select *
from jsonb_array_elements(data -> 'availability') as x(item)
where (x.item ->> 'price')::int > 100);