Der er ingen indbygget jsonb
operatører eller nogen indekser, der understøtter denne type filter direkte (endnu).
Jeg foreslår en EXISTS
semi-join:
SELECT t.*
FROM tbl t
WHERE EXISTS (
SELECT FROM jsonb_array_elements(t.jsoncol) elem
WHERE elem->>'value' LIKE '%ba%'
);
Det undgår overflødige evalueringer og den endelige DISTINCT
trin du skal bruge for at få distinkte rækker med en almindelig CROSS JOIN
.
Hvis dette stadig ikke er hurtigt nok, ville en mere sofistikeret specialiseret løsning til den givne type forespørgsel være at udtrække en sammenkædet streng af unikke værdier (med et skilletegn, der ikke forstyrrer dine søgemønstre) pr. række i en IMMUTABLE
funktion, skal du bygge et trigram GIN-indeks på det funktionelle udtryk og bruge det samme udtryk i dine forespørgsler.
Relateret:
- Søg efter indlejrede værdier i jsonb-array med større operator
- Find rækker, der indeholder en nøgle i et JSONB-array af poster
- Opret Postgres JSONB Index på Array Sub-Object
Bortset fra, hvis din jsonb
værdier virkelig ligner eksemplet, kan du trimme en masse støj og bare gemme:
[
{"foo":"bar"},
{"biz":"baz"},
{"beep":"boop"}
]