PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Abfragen eines JSON-Arrays von Objekten in Postgres

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