sql >> Base de Datos >  >> RDS >> PostgreSQL

Consultando una matriz JSON de objetos en Postgres

tienes que desanidar la matriz de json-objects primero usando la función (json_array_elements o jsonb_array_elements si tiene el tipo de datos jsonb ), luego puede acceder a los valores especificando la clave.

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 obtener un recuento de nombres únicos, es una consulta similar a la anterior, excepto que la función agregada de recuento distinto se aplica 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

Es necesario usar ->> en lugar de -> como el anterior (->> ) convierte el valor extraído como texto, lo que admite la comparación de igualdad (necesaria para un recuento distinto), mientras que el último (-> ) extrae el valor como json, que no admite la comparación de igualdad.

Alternativamente, convierta el json como jsonb y usa jsonb_array_elements . JSONB admite la comparación de igualdad, por lo que es posible usar COUNT DISTINCT junto con la extracción a través de -> , es decir,

COUNT(DISTINCT (y.x::jsonb)->'name')