você precisa desaninhar a matriz de objetos json primeiro usando a função (
json_array_elements ou jsonb_array_elements se você tiver o tipo de dados jsonb ), então você pode acessar os valores especificando a chave. WITH json_test (col) AS (
values (json '[{"name":"Mickey Mouse","age":10},{"name":"Donald Duck","age":5}]')
)
SELECT
y.x->'name' "name"
FROM json_test jt,
LATERAL (SELECT json_array_elements(jt.col) x) y
-- outputs:
name
--------------
"Mickey Mouse"
"Donald Duck"
Para obter uma contagem de nomes exclusivos, é uma consulta semelhante à acima, exceto que a função de agregação de contagem distinta é aplicada a
y.x->>name WITH json_test (col) AS (
values (json '[{"name":"Mickey Mouse","age":10},{"name":"Donald Duck","age":5}]')
)
SELECT
COUNT( DISTINCT y.x->>'name') distinct_names
FROM json_test jt,
LATERAL (SELECT json_array_elements(jt.col) x) y
É necessário usar
->> em vez de -> como o primeiro (->> ) converte o valor extraído como texto, que suporta comparação de igualdade (necessária para contagem distinta), enquanto o último (-> ) extrai o valor como json, que não oferece suporte à comparação de igualdade. Como alternativa, converta o
json como jsonb e use jsonb_array_elements . JSONB suporta a comparação de igualdade, portanto, é possível usar COUNT DISTINCT junto com a extração via -> , ou seja COUNT(DISTINCT (y.x::jsonb)->'name')