vous devez désimbriquer le tableau d'objets json en utilisant d'abord la fonction (json_array_elements
ou jsonb_array_elements
si vous avez le type de données jsonb ), vous pouvez alors accéder aux valeurs en spécifiant la clé.
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"
Pour obtenir un nombre de noms uniques, c'est une requête similaire à celle ci-dessus, sauf que la fonction d'agrégation count distinct est appliquée à 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
Il faut utiliser ->>
au lieu de ->
comme l'ancien (->>
) convertit la valeur extraite en texte, qui prend en charge la comparaison d'égalité (nécessaire pour un comptage distinct), alors que cette dernière (->
) extrait la valeur au format json, qui ne prend pas en charge la comparaison d'égalité.
Alternativement, convertissez le json
comme jsonb
et utilisez jsonb_array_elements
. JSONB
prend en charge la comparaison d'égalité, il est donc possible d'utiliser COUNT DISTINCT avec l'extraction via ->
, c'est-à-dire
COUNT(DISTINCT (y.x::jsonb)->'name')