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')