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