sql >> Database teknologi >  >> RDS >> PostgreSQL

Postgresql-forespørgsel efter objekter i indlejret JSONB-felt

Du bør blive fortrolig med JSON-funktioner og -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 introducerer nye funktioner, der implementerer SQL/JSON Path Language. Alternative forespørgsler ved hjælp af jsonpath kan se sådan ud:

-- #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 første to forespørgsler ligner grundlæggende de foregående og -> syntaks kan virke enklere og mere behagelig end jsonpath en. Der bør lægges særlig vægt på den tredje forespørgsel, som bruger et jokertegn, så det eliminerer behovet for at bruge den dyre funktion jsonb_each_text () og burde være væsentligt hurtigere.

Læs i dokumentationen:




  1. Spring Data @CreatedDate annotering virker ikke for mig

  2. Administrer MySQL med phpMyAdmin på Debian 5 (Lenny)

  3. Vælg antal rækker i en anden tabel i en Postgres SELECT-sætning

  4. Først-ind-først-ud (FIFO) lagerkalkulation