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

Forespørgsel til en JSON-array af objekter i Postgres

du skal undest arrayet af json-objekter først ved hjælp af funktionen (json_array_elements eller jsonb_array_elements hvis du har jsonb-datatypen ), så kan du få adgang til værdierne ved at angive nøglen.

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"

For at få en optælling af unikke navne er det en lignende forespørgsel som ovenstående, bortset fra at funktionen tæller distinkt aggregeret anvendes på y.x->>navn

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

Det er nødvendigt at bruge ->> i stedet for -> som den tidligere (->> ) kaster den udtrukne værdi som tekst, hvilket understøtter lighedssammenligning (nødvendig for en bestemt optælling), hvorimod sidstnævnte (-> ) udtrækker værdien som json, hvilket ikke understøtter lighedssammenligning.

Alternativt kan du konvertere json som jsonb og brug jsonb_array_elements . JSONB understøtter lighedssammenligningen, så det er muligt at bruge COUNT DISTINCT sammen med ekstraktion via -> , dvs.

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


  1. Introduktion til OPENJSON med eksempler (SQL-server)

  2. Implementer en Hybrid Cloud MySQL-database ved hjælp af ClusterControl

  3. Langsom enkel opdateringsforespørgsel på PostgreSQL-database med 3 millioner rækker

  4. PHP:oci_bind_by_name og tidsstempelfelt resulterer i ORA-01461:kan kun binde en LONG værdi til indsættelse i en LONG kolonne