PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Consultando uma matriz JSON de objetos no Postgres


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