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 formejsonType de données. Pas besoin d'un plâtre supplémentaire. -
Mieux encore, utilisez un
LATERALréférence dansEXISTS. C'est beaucoup plus propre que de désimbriquer avec une fonction de retour d'ensemble dans leSELECTliste. Connexe : -
Utilisez
ILIKE(~~*) pour la correspondance de modèle. Correspondances d'expressions régulières (~,~*) sont plus puissants, mais aussi plus chers. Utilisez donc leLIKEde base /ILKEoù 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 ...