JSON関数と演算子 に精通している必要があります 。
-- #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 SQL/JSONパス言語を実装する新機能を紹介します。 jsonpath
を使用した代替クエリ 次のようになります:
-- #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")');
最初の2つのクエリは、基本的に前のクエリと->
に似ています。 構文はjsonpath
よりも単純で快適に見えるかもしれません 1。ワイルドカードを使用する3番目のクエリには特に注意を払う必要があります。これにより、高価な関数jsonb_each_text ()
を使用する必要がなくなります。 大幅に高速化する必要があります。
ドキュメントを読む: