je moet onthaasten de array van json-objecten eerst met behulp van de functie (json_array_elements
of jsonb_array_elements
als je jsonb-gegevenstype hebt ), dan krijgt u toegang tot de waarden door de sleutel op te geven.
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"
Om een telling van unieke namen te krijgen, is het een gelijkaardige zoekopdracht als de bovenstaande, behalve dat de count distinct aggregatiefunctie wordt toegepast op 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
Het is noodzakelijk om ->>
. te gebruiken in plaats van ->
als de vorige (->>
) cast de geëxtraheerde waarde als tekst, wat gelijkheidsvergelijking ondersteunt (nodig voor verschillende telling), terwijl de laatste (->
) extraheert de waarde als json, wat geen gelijkheidsvergelijking ondersteunt.
U kunt ook de json
. converteren als jsonb
en gebruik jsonb_array_elements
. JSONB
ondersteunt de gelijkheidsvergelijking, dus het is mogelijk om COUNT DISTINCT te gebruiken samen met extractie via ->
, d.w.z.
COUNT(DISTINCT (y.x::jsonb)->'name')