Sua consulta está próxima.
json_each()
é a função chave. Ou jsonb_each() para jsonb . Algumas melhorias:SELECT *
FROM things t
WHERE EXISTS (
SELECT FROM json_each(t.blueprint) b
WHERE b.value->>'name' ILIKE 'azamund'
);
Antigo sqlfiddle
db<>fiddle aqui
-
json_each()já retorna o valor comojsontipo de dados. Não há necessidade de um elenco adicional.
-
Melhor ainda, use umLATERALreferência emEXISTS. Isso é muito mais limpo do que desaninhar com uma função de retorno de conjunto noSELECTLista. Relacionado:
-
UseILIKE(~~*) para a correspondência de padrão. Correspondências de expressões regulares (~,~*) são mais poderosos, mas também mais caros. Então use o básicoLIKE/ILKEonde você pode. Detalhes:
Alternativa com matriz JSON
Você já viu minha resposta relacionada para matrizes JSON:
Embora a consulta de objetos JSON aninhados pareça tão simples, há um suporte a índice superior para a matriz:
Pode ficar mais simples/eficiente com SQL/JSON no Postgres 12...