sql >> Databáze >  >> RDS >> PostgreSQL

Vyhledejte v poli JSON objekt obsahující hodnotu odpovídající vzoru

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


  1. Funkce SQL velmi pomalá ve srovnání s dotazem bez funkce wrapper

  2. Různé způsoby monitorování skupin dostupnosti serveru SQL Server AlwaysOn

  3. Jak zacházet s volitelnou hodnotou vrácenou dotazem pomocí bedny postgres?

  4. Prohlížeč Neo4j