sql >> Databasteknik >  >> RDS >> PostgreSQL

Postgresql-fråga för objekt i kapslat JSONB-fält

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:




  1. Spring app tappar anslutningen till MySql efter 8 timmar. Hur konfigurerar man korrekt?

  2. Hur man räknar objekt i kommaseparerad lista MySQL

  3. array för multipla where_in-villkor i codeigniter

  4. returnera resultat från funktion