PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Durchsuchen Sie ein JSON-Array nach einem Objekt, das einen Wert enthält, der mit einem Muster übereinstimmt

Es gibt kein eingebautes jsonb Operatoren noch irgendwelche Indizes, die diese Art von Filter (noch) direkt unterstützen.

Ich schlage ein EXISTS vor Semi-Join:

SELECT t.*
FROM   tbl t
WHERE  EXISTS (
   SELECT FROM jsonb_array_elements(t.jsoncol) elem
   WHERE  elem->>'value' LIKE '%ba%'
   );

Es vermeidet redundante Auswertungen und das abschließende DISTINCT Schritt müssten Sie eindeutige Zeilen mit einem einfachen CROSS JOIN erhalten .

Wenn dies immer noch nicht schnell genug ist, wäre eine viel ausgefeiltere spezialisierte Lösung für den gegebenen Abfragetyp das Extrahieren einer verketteten Zeichenfolge eindeutiger Werte (mit einem Trennzeichen, das Ihre Suchmuster nicht stört) pro Zeile in einem IMMUTABLE Funktion, erstellen Sie einen Trigramm-GIN-Index auf dem funktionalen Ausdruck und verwenden Sie denselben Ausdruck in Ihren Abfragen.

Verwandte:

  • Suche nach verschachtelten Werten im jsonb-Array mit größerem Operator
  • Suchen Sie Zeilen, die einen Schlüssel in einem JSONB-Array von Datensätzen enthalten
  • Postgres-JSONB-Index für Array-Unterobjekt erstellen

Abgesehen davon, wenn Ihr jsonb Werte wirklich wie im Beispiel aussehen, könnten Sie viel Rauschen trimmen und einfach speichern:

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