Votre requête est proche. json_each()
est la fonction clé. Ou jsonb_each()
pour jsonb
. Quelques améliorations :
SELECT *
FROM things t
WHERE EXISTS (
SELECT FROM json_each(t.blueprint) b
WHERE b.value->>'name' ILIKE 'azamund'
);
Ancien sqlfiddle
db<>violon ici
-
json_each()
renvoie déjà la valeur sous la formejson
Type de données. Pas besoin d'un plâtre supplémentaire. -
Mieux encore, utilisez un
LATERAL
référence dansEXISTS
. C'est beaucoup plus propre que de désimbriquer avec une fonction de retour d'ensemble dans leSELECT
liste. Connexe : -
Utilisez
ILIKE
(~~*
) pour la correspondance de modèle. Correspondances d'expressions régulières (~
,~*
) sont plus puissants, mais aussi plus chers. Utilisez donc leLIKE
de base /ILKE
où vous pouvez. Détails :
Alternative avec tableau JSON
Vous avez déjà vu ma réponse connexe pour les tableaux JSON :
Bien que la requête pour les objets JSON imbriqués semble tout aussi simple, il existe une meilleure prise en charge des index pour le tableau :
Peut devenir plus simple / plus efficace avec SQL/JSON dans Postgres 12 ...