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 alsjsonzurück Datentyp. Keine zusätzliche Besetzung erforderlich. -
Besser noch, verwenden Sie einen
LATERALVerweis inEXISTS. Dies ist viel sauberer als das Aufheben der Verschachtelung mit einer Set-Returning-Funktion inSELECTauffü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/ILKEwo 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 ...