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 somjsondata typ. Inget behov av en extra rollbesättning. -
Ännu bättre, använd en
LATERALreferens iEXISTS. Detta är mycket renare än att lösa upp med en set-returnerande funktion iSELECTlista. Relaterat: -
Använd
ILIKE(~~*) för mönstermatchningen. Reguljära uttryck matchar (~,~*) är kraftfullare, men också dyrare. Så använd den grundläggandeLIKE/ILKEdä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 ...