JSON_ARRAYAGG liefert einzelnes Objekt anstatt Array

jemand

Benutzer
Beiträge
12
Hallo,

manchmal bekomme ich bei JSON_ARRAYAGG nur einzelne Objekte anstatt ein Array.

Also:
Code:
{"ID" : 1, "Name" : "Name 1"}, {"ID" : 2, "Name" : "Name 2"}
anstelle von:
Code:
[{"ID" : 1, "Name" : "Name 1"}, {"ID" : 2, "Name" : "Name 2"}]

Weiß einer, woran das liegen könnte?

Danke
 
Werbung:
works for me:

Code:
test=*# select * from jemand;
 id |             val             
----+-----------------------------
  1 | {"ID": 1, "Name": "Name 1"}
  2 | {"ID": 2, "Name": "Name 2"}
(2 rows)

test=*# select jsonb_agg(val) from jemand;
                         jsonb_agg                         
------------------------------------------------------------
 [{"ID": 1, "Name": "Name 1"}, {"ID": 2, "Name": "Name 2"}]
(1 row)

test=*#
 
Es ist nicht das gleiche Beispiel wie oben, aber hier noch ein Beispiel:

Code:
SELECT JSON_ARRAYAGG(DISTINCT Hobbies.Relevanz) FROM Nutzer LEFT JOIN Hobbies ON ID = Hobbies.NutzerID WHERE ID = 2 GROUP BY Nutzer.ID;

Wenn ich das ausführe, bekomme ich [3].

Code:
SELECT JSON_ARRAYAGG(DISTINCT Hobbies.Relevanz) FROM Nutzer LEFT JOIN Hobbies ON ID = Hobbies.NutzerID WHERE ID >= 2 AND ID < 3 GROUP BY Nutzer.ID;

Führe ich das aus, bekomme ich 3.
 
Tja, MySQL.

Code:
test=*# select version();
                                                             version                                                             
---------------------------------------------------------------------------------------------------------------------------------
 PostgreSQL 13.0 (Ubuntu 13.0-1.pgdg18.04+1) on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0, 64-bit
(1 row)
 
Wozu setzt Du das Group By ein? Das ist falsch, lass es weg.

Wenn Du die Nutzer ID brauchst, musst Du sie auch mit ausgeben.
Wenn Du sie ausgibst, dann erst musst Du darauf gruppieren.

Lies Dir das mal durch, wie eine Aggregation mit Group by funktioniert und was da bei mySQL alles schief gehen kann.
 
Das
Wozu setzt Du das Group By ein? Das ist falsch, lass es weg.

Wenn Du die Nutzer ID brauchst, musst Du sie auch mit ausgeben.
Wenn Du sie ausgibst, dann erst musst Du darauf gruppieren.

Lies Dir das mal durch, wie eine Aggregation mit Group by funktioniert und was da bei mySQL alles schief gehen kann.

Ich hatte scheinbar einen Denkfehler drin. Zuvor hatte ich ohne der JSON-Aggregation gearbeitet. Also für jede Relevanz des Nutzers wurde eine neue Zeile ausgegeben. Nachdem ich die Aggregation verwendet hatte, dachte ich, dass ich nach der Nutzer-ID gruppieren muss, damit für jeden Nutzer nur eine Zeile entsteht und nicht mehrere Zeilen mit dem gleichen JSON-Array.
 
Ob json oder nich json, eine Aggregation ist eine Aggregation. Wenn nicht aggregierte Werte ausgegeben werden sollen, dann und nur dann muss das Group By diese Werte aufführen. Leider kannst Du Dich da auf mySQL nicht verlassen, es produziert Dir dann bei falscher Gruppierung (falsch formuliert) falsche Ausgaben!
Denk mal drüber nach, Deine Datenbank umzustellen. Dann hast Du Ruhe davor und bekommst ordentliche Fehlermeldungen, falls Du etwas falsches schreibst.
 
Werbung:
Zurück
Oben