Sí, eso es posible:
SELECT *
FROM tbl t, json_array_elements(t.json_col->'emails') AS elem
WHERE elem->>'id' = 123;
tbl
siendo el nombre de su tabla, json_col
siendo el nombre de la columna JSON.
Más detalles en esta respuesta relacionada:
- ¿Cómo consulto usando campos dentro del nuevo tipo de datos PostgreSQL JSON?
Más sobre el CROSS JOIN LATERAL
implícito en el último párrafo de esta respuesta relacionada:
- PostgreSQL unnest() con número de elemento
Índice para admitir este tipo de consulta:
- Índice para encontrar un elemento en una matriz JSON