Datentyp SUM Ergebnis in MySQL
-
11-07-2019 - |
Frage
Ich bin mit der Umwandlung des Ergebnisses einer MySQL-Abfrage zu einer Java-Klasse ein bisschen ein Problem haben, wenn SUM verwendet wird.
Wenn Sie eine einfache Summe in MySQL Ausführen
SELECT SUM(price) FROM cakes WHERE ingredient = 'chocolate';
mit price
eine ganze Zahl, scheint es, dass die SUM
manchmal einen String zurückgibt und manchmal eine ganze Zahl, abhängig von der Version des JDBC-Treibers.
Offenbar führt der Server den JDBC-Treiber sagen, dass das Ergebnis der SUM
ein String ist, und der JDBC-Treiber manchmal ‚bequem‘ wandelt diese in eine Ganzzahl. (Siehe Marc Matthews' Erklärung ).
Der Java-Code verwendet einige BeanInfo und Introspection in einer (Liste) Bohne (n) mit dem Ergebnis einer Abfrage automatisch füllen. Aber das kann natürlich nicht funktionieren, wenn die Datentypen zwischen Servern unterscheiden, wo die Anwendung bereitgestellt wird.
ist mir egal, ob ich einen String oder eine ganze Zahl, aber ich möchte immer den gleichen Datentyp haben, oder zumindest im Voraus wissen, welche Datentypen ich bekommen werde.
Gibt es eine Möglichkeit zu wissen, welchen Datentyp wird von einem MySQL SUM
aus dem Java-Code zurückgegeben werden? Oder weiß jemand etwas besseren Weg, um damit umzugehen?
Lösung
Das ist nur eine Vermutung, aber vielleicht MySQL auf ganzzahlige Casting zwingen immer zu sagen, es ist eine ganze Zahl.
SELECT CAST(SUM(price) AS SIGNED) FROM cakes WHERE ingredient = 'marshmallows';
Andere Tipps
Ich habe noch nie mit MySQL gearbeitet, bevor, so kann ich nicht sagen, warum, aber wenn Sie sagen:
ResultSet rs = statement.executeQuery("SELECT SUM(price) FROM cakes WHERE ingredient = 'chocolate'");
int sum = 0;
if(rs.next())
size = Integer.parseInt(rs.getString(1));
Dann sollten Sie kein Problem, unabhängig von der zurückDatenTyp haben wie die Dokumentation sagt:
String getString (int column) throws SQLException
Ruft den Wert der bezeichneten Spalte in der aktuellen Zeile dieses Objekt ResultSet als String in der Programmiersprache Java
Ich fand COALESCE(SUM(price),0)
gut für immer gewährleistet das Feld 0 zurückgegeben, wenn kein Ergebnis.
Siehe auch: http://lists.mysql.com/mysql/177427