Du bör bli bekant med JSON-funktioner och -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 introducerar nya funktioner som implementerar SQL/JSON Path Language. Alternativa frågor som använder jsonpath
kan se ut så här:
-- #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 två första frågorna liknar i princip de föregående och ->
syntax kan verka enklare och trevligare än jsonpath
ett. Särskild uppmärksamhet bör ägnas åt den tredje frågan, som använder ett jokertecken så att den eliminerar behovet av att använda den dyra funktionen jsonb_each_text ()
och bör vara betydligt snabbare.
Läs i dokumentationen: