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 alsjson
data type. Geen extra cast nodig. -
Beter nog, gebruik een
LATERAL
referentie inEXISTS
. Dit is veel schoner dan het verwijderen van nesten met een set-return-functie in deSELECT
lijst. Gerelateerd: -
Gebruik
ILIKE
(~~*
) voor de patroonovereenkomst. Reguliere expressie komt overeen (~
,~*
) zijn krachtiger, maar ook duurder. Gebruik dus de basisLIKE
/ILKE
waar 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 ...