U moet bekend raken met JSON-functies en -operators .
-- #1
select *
from example
where content->'Item'->>'Name' ilike '%dog%'
and content->'Item'->>'Spec' ilike '%red%'
-- #2
select *
from example
where content->'Item'->>'Name' ilike '%dog%'
or content->'Item'->>'Spec' ilike '%red%'
-- #3
select distinct on(no) t.*
from example t,
lateral jsonb_each_text(content->'Item')
where value ilike '%dog%';
-- and
select *
from example t
order by length(content->'Item'->>'Name');
Postgres 12 introduceert nieuwe functies die de SQL/JSON Path Language implementeren. Alternatieve zoekopdrachten met het jsonpath
kan er als volgt uitzien:
-- #1
select *
from example
where jsonb_path_exists(
content,
'$ ? ($.Item.Name like_regex "dog" flag "i" && $.Item.Spec like_regex "red" flag "i")');
-- #2
select *
from example
where jsonb_path_exists(
content,
'$ ? ($.Item.Name like_regex "dog" flag "i" || $.Item.Spec like_regex "red" flag "i")');
-- #3
select *
from example
where jsonb_path_exists(
content,
'$.Item.* ? (@ like_regex "dog" flag "i")');
De eerste twee zoekopdrachten zijn in principe gelijk aan de vorige en de ->
syntaxis lijkt misschien eenvoudiger en prettiger dan jsonpath
een. Bijzondere aandacht moet worden besteed aan de derde zoekopdracht, die een jokerteken gebruikt, zodat de dure functie jsonb_each_text ()
niet nodig is en zou aanzienlijk sneller moeten zijn.
Lees in de documentatie: