Trouver un prix supérieur à l'utilisation des opérateurs JSON
Aug 20 2020
Json:
"availability": [
{
"qty": 25,
"price": 3599,
"is_available": true
},
{
"qty": 72,
"price": 3599,
},
"is_available": true
]
Si je veux trouver un prix avec une valeur = " 3599 ", j'utilise cette requête:
select *
from product
where to_tsvector(product.data #>> '{availability}') @@ to_tsquery('3599')
ou cette requête:
SELECT *
FROM product
WHERE product.data @> '{"availability": [ { "price": 3599} ] }';
Agréable. Cela fonctionne bien.
Mais j'ai aussi besoin de trouver un prix> 1000
J'essaye ceci:
select *
from product
where to_tsvector(product.data #>> '{availability}') @@ to_tsquery('>1000')
Mais le résultat est vide (rien trouvé).
Réponses
3 a_horse_with_no_name Aug 20 2020 at 12:33
La recherche en texte intégral n'est pas le bon outil pour ce type de requêtes.
Avec Postgres 12, vous pouvez utiliser une expression JSON / Path:
select *
from product
where data @@ '$.availability[*].price > 100';
Pour les anciennes versions de Postgres, vous devez annuler l'imbrication de la baie:
select *
from product
where exists (select *
from jsonb_array_elements(data -> 'availability') as x(item)
where (x.item ->> 'price')::int > 100);