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 comojson
tipo de dados. Não há necessidade de um elenco adicional.
-
Melhor ainda, use umLATERAL
referência emEXISTS
. Isso é muito mais limpo do que desaninhar com uma função de retorno de conjunto noSELECT
Lista. 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
/ILKE
onde 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...