Ihre Abfrage ist nahe. json_each()
ist die Schlüsselfunktion. Oder jsonb_each()
für jsonb
. Ein paar Verbesserungen:
SELECT *
FROM things t
WHERE EXISTS (
SELECT FROM json_each(t.blueprint) b
WHERE b.value->>'name' ILIKE 'azamund'
);
Altes sqlfiddle
db<>fiddle hier
-
json_each()
gibt den Wert bereits alsjson
zurück Datentyp. Keine zusätzliche Besetzung erforderlich. -
Besser noch, verwenden Sie einen
LATERAL
Verweis inEXISTS
. Dies ist viel sauberer als das Aufheben der Verschachtelung mit einer Set-Returning-Funktion inSELECT
aufführen. Verwandte: -
Verwenden Sie
ILIKE
(~~*
) für die Musterübereinstimmung. Übereinstimmungen mit regulären Ausdrücken (~
,~*
) sind leistungsfähiger, aber auch teurer. Verwenden Sie also das einfacheLIKE
/ILKE
wo Du kannst. Einzelheiten:
Alternative mit JSON-Array
Sie haben bereits meine verwandte Antwort für JSON-Arrays gesehen:
Während die Abfrage für verschachtelte JSON-Objekte genauso einfach erscheint, gibt es eine überlegene Indexunterstützung für das Array:
Kann mit SQL/JSON in Postgres 12 einfacher/effizienter werden ...