Sim, isso é possível:
SELECT *
FROM tbl t, json_array_elements(t.json_col->'emails') AS elem
WHERE elem->>'id' = 123;
tbl
sendo o nome da sua tabela, json_col
sendo o nome da coluna JSON. Mais detalhes nesta resposta relacionada:
- Como faço para consultar usando campos dentro do novo tipo de dados JSON do PostgreSQL?
Mais sobre o
CROSS JOIN LATERAL
implícito no último parágrafo desta resposta relacionada:- PostgreSQL unnest() com número do elemento
Índice para suportar este tipo de consulta:
- Índice para encontrar um elemento em uma matriz JSON