PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Interroger un tableau JSON d'objets dans Postgres

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