Nejsou zde žádné vestavěné jsonb
operátory ani žádné indexy, které tento druh filtru přímo (zatím) podporují.
Navrhuji EXISTS
poloviční spojení:
SELECT t.*
FROM tbl t
WHERE EXISTS (
SELECT FROM jsonb_array_elements(t.jsoncol) elem
WHERE elem->>'value' LIKE '%ba%'
);
Vyhýbá se nadbytečným hodnocením a konečnému DISTINCT
V tomto kroku byste potřebovali získat odlišné řádky s jednoduchým CROSS JOIN
.
Pokud to stále není dostatečně rychlé, sofistikovanějším specializovaným řešením pro daný typ dotazu by bylo extrahovat zřetězený řetězec jedinečných hodnot (s oddělovačem, který nebude narušovat vaše vyhledávací vzory) na řádek v IMMUTABLE
vytvořte trigramový GIN index na funkčním výrazu a použijte stejný výraz ve svých dotazech.
Související:
- Hledejte vnořené hodnoty v poli jsonb s větším operátorem
- Najděte řádky obsahující klíč v poli záznamů JSONB
- Vytvořte Postgres JSONB Index na Array Sub-Object
Kromě toho, pokud váš jsonb
hodnoty skutečně vypadají jako v příkladu, mohli byste oříznout spoustu šumu a uložit:
[
{"foo":"bar"},
{"biz":"baz"},
{"beep":"boop"}
]