sql >> Databasteknik >  >> RDS >> PostgreSQL

Sök i en JSON-array efter ett objekt som innehåller ett värde som matchar ett mönster

Det finns inga inbyggda jsonb operatorer eller några index som stöder denna typ av filter direkt (ännu).

Jag föreslå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%'
   );

Den undviker redundanta utvärderingar och den slutliga DISTINCT steg du skulle behöva för att få distinkta rader med en vanlig CROSS JOIN .

Om detta fortfarande inte är tillräckligt snabbt, skulle en mer sofistikerad, specialiserad lösning för den givna typen av fråga vara att extrahera en sammanfogad sträng av unika värden (med en avgränsare som inte stör dina sökmönster) per rad i en IMMUTABLE funktion, bygg ett trigram GIN-index på det funktionella uttrycket och använd samma uttryck i dina frågor.

Relaterat:

  • Sök efter kapslade värden i jsonb-arrayen med större operator
  • Hitta rader som innehåller en nyckel i en JSONB-uppsättning av poster
  • Skapa Postgres JSONB Index på Array Sub-Object

Bortsett från, om din jsonb värden verkligen ser ut som exemplet, du kan trimma mycket brus och bara lagra:

[
   {"foo":"bar"},
   {"biz":"baz"},
   {"beep":"boop"}
]


  1. Säkra filer för nedladdning

  2. KGXGN polling fel (15)

  3. SQLite INSERT - PÅ DUPLIKATNYCKELUPPDATERING (UPSERT)

  4. Dynamisk uppdateringssats med variabla kolumnnamn