Uw vraag is dichtbij. json_each()
is de sleutelfunctie. Of jsonb_each() voor jsonb . Een paar verbeteringen:
SELECT *
FROM things t
WHERE EXISTS (
SELECT FROM json_each(t.blueprint) b
WHERE b.value->>'name' ILIKE 'azamund'
);
Oude sqlfiddle
db<>fiddle hier
-
json_each()geeft de waarde al terug alsjsondata type. Geen extra cast nodig. -
Beter nog, gebruik een
LATERALreferentie inEXISTS. Dit is veel schoner dan het verwijderen van nesten met een set-return-functie in deSELECTlijst. Gerelateerd: -
Gebruik
ILIKE(~~*) voor de patroonovereenkomst. Reguliere expressie komt overeen (~,~*) zijn krachtiger, maar ook duurder. Gebruik dus de basisLIKE/ILKEwaar je kan. Details:
Alternatief met JSON-array
Je hebt mijn gerelateerde antwoord voor JSON-arrays al gezien:
Hoewel de query voor geneste JSON-objecten net zo eenvoudig lijkt, is er superieure indexondersteuning voor de array:
Kan eenvoudiger / efficiënter worden met SQL/JSON in Postgres 12 ...