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