PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Interrogazione di un array JSON di oggetti in Postgres

devi disinserire l'array di oggetti json prima usando la funzione (json_array_elements o jsonb_array_elements se hai il tipo di dati jsonb ), quindi puoi accedere ai valori specificando la chiave.

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"

Per ottenere un conteggio di nomi univoci, è una query simile alla precedente, tranne per il fatto che la funzione di aggregazione distinta conteggio viene applicata 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

È necessario utilizzare ->> invece di -> come il primo (->> ) esegue il cast del valore estratto come testo, che supporta il confronto di uguaglianza (necessario per un conteggio distinto), mentre quest'ultimo (-> ) estrae il valore come json, che non supporta il confronto di uguaglianza.

In alternativa, converti json come jsonb e usa jsonb_array_elements . JSONB supporta il confronto di uguaglianza, quindi è possibile utilizzare COUNT DISTINCT insieme all'estrazione tramite -> , cioè

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