Sie müssen entschachteln das Array von JSON-Objekten zuerst mit der Funktion (json_array_elements
oder jsonb_array_elements
wenn Sie den Datentyp jsonb haben ), dann können Sie auf die Werte zugreifen, indem Sie den Schlüssel angeben.
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"
Um eine Anzahl von eindeutigen Namen zu erhalten, ist dies eine ähnliche Abfrage wie oben, außer dass die Aggregatfunktion Count Distinct auf y.x->>name
angewendet wird
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
Es ist notwendig, ->>
zu verwenden statt ->
wie ersteres (->>
) wandelt den extrahierten Wert in Text um, was den Gleichheitsvergleich unterstützt (erforderlich für die eindeutige Zählung), während letzterer (->
) extrahiert den Wert als json, was keinen Gleichheitsvergleich unterstützt.
Konvertieren Sie alternativ den json
als jsonb
und verwenden Sie jsonb_array_elements
. JSONB
unterstützt den Gleichheitsvergleich, daher ist es möglich, COUNT DISTINCT zusammen mit der Extraktion über ->
zu verwenden , also
COUNT(DISTINCT (y.x::jsonb)->'name')