Din fråga är nära. json_each()
är nyckelfunktionen. Eller jsonb_each()
för jsonb
. Ett par förbättringar:
SELECT *
FROM things t
WHERE EXISTS (
SELECT FROM json_each(t.blueprint) b
WHERE b.value->>'name' ILIKE 'azamund'
);
-
json_each()
returnerar redan värdet somjson
data typ. Inget behov av en extra rollbesättning. -
Ännu bättre, använd en
LATERAL
referens iEXISTS
. Detta är mycket renare än att lösa upp med en set-returnerande funktion iSELECT
lista. Relaterat: -
Använd
ILIKE
(~~*
) för mönstermatchningen. Reguljära uttryck matchar (~
,~*
) är kraftfullare, men också dyrare. Så använd den grundläggandeLIKE
/ILKE
där du kan. Detaljer:
Alternativ med JSON-array
Du har redan sett mitt relaterade svar för JSON-arrayer:
Även om frågan för kapslade JSON-objekt verkar lika enkel, finns det överlägset indexstöd för arrayen:
Kan bli enklare / effektivare med SQL/JSON i Postgres 12 ...