Du bør blive fortrolig med JSON-funktioner og -operatører .
-- #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 introducerer nye funktioner, der implementerer SQL/JSON Path Language. Alternative forespørgsler ved hjælp af jsonpath
kan se sådan ud:
-- #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 første to forespørgsler ligner grundlæggende de foregående og ->
syntaks kan virke enklere og mere behagelig end jsonpath
en. Der bør lægges særlig vægt på den tredje forespørgsel, som bruger et jokertegn, så det eliminerer behovet for at bruge den dyre funktion jsonb_each_text ()
og burde være væsentligt hurtigere.
Læs i dokumentationen: