Din forespørgsel er tæt på. json_each()
er nøglefunktionen. Eller jsonb_each()
for jsonb
. Et par forbedringer:
SELECT *
FROM things t
WHERE EXISTS (
SELECT FROM json_each(t.blueprint) b
WHERE b.value->>'name' ILIKE 'azamund'
);
Gammel sqlfiddle
db<>fiddle her
-
json_each()
returnerer allerede værdien somjson
datatype. Intet behov for en ekstra rollebesætning. -
Endnu bedre, brug en
LATERAL
reference iEXISTS
. Dette er meget renere end unnesting med en sæt-retur-funktion iSELECT
liste. Relateret: -
Brug
ILIKE
(~~*
) for mønstermatchen. Regulære udtryk matcher (~
,~*
) er mere kraftfulde, men også dyrere. Så brug den grundlæggendeLIKE
/ILKE
hvor du kan. Detaljer:
Alternativ med JSON-array
Du har allerede set mit relaterede svar for JSON-arrays:
Mens forespørgslen efter indlejrede JSON-objekter virker lige så enkel, er der overlegen indeksunderstøttelse for arrayet:
Kan blive enklere / mere effektiv med SQL/JSON i Postgres 12 ...