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