web-dev-qa-db-fra.com

Requête PostgreSQL pour les objets dans le champ JSONB imbriqué

J'utilise PostgreSQL 9.6, et j'ai une table nommée "ItemDbModel" avec deux colonnes qui ressemble à ceci:

No integer,
Content jsonb

Disons que j'ai mis beaucoup de disques comme:

 "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"}}

Comment puis-je interroger la table pour:

  1. Enregistre où "Content.Item.Name" contient "Dog" Et "Content.Item.Spec" contient "red".
  2. Enregistre où "Content.Item.Name" contient "Dog" OU "Content.Item.Spec" contient "red".
  3. Enregistre où Any champs json dans "Content.Item" contient "dog".

Et commander par "Content.Item.Name.length"?

Je vous remercie!

17
ifdog

Vous devez vous familiariser avec Fonctions et opérateurs 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