web-dev-qa-db-ja.com

ネストされたJSONBフィールドのオブジェクトに対するPostgresqlクエリ

私はPostgreSQL 9.6を使用していて、次のような2つの列を持つ「ItemDbModel」という名前のテーブルがあります。

No integer,
Content jsonb

私が次のような多くのレコードを置いたとしましょう:

 "No": 2, {"obj":"x","Item": {"Name": "BigDog", "Model": "NamedHusky", "Spec":"red dog"}}
 "No": 4, {"obj":"x","Item": {"Name": "MidDog", "Model": "NamedPeppy", "Spec":"no hair"}}
 "No": 5, {"obj":"x","Item": {"Name": "BigCat", "Model": "Tomcat", "Spec":"blue color"}}

テーブルをクエリするにはどうすればよいですか?

  1. 「Content.Item.Name」に「Dog」が含まれるレコードAnd「Content.Item.Spec」に「red」が含まれます。
  2. 「Content.Item.Name」に「Dog」が含まれるレコード[〜#〜] or [〜#〜]「Content.Item.Spec」に「red」が含まれます。
  3. 「Content.Item」のAny jsonフィールドに「dog」が含まれるレコード。

そして「Content.Item.Name.length」で注文しますか?

ありがとうございました!

17
ifdog

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');
28
klin