Sieht für mich wie ein Fehler aus und ich kann dieses rätselhafte Verhalten bestätigen in:
10.2.14-MariaDB
Wenn möglich, können Sie den ganzzahligen Wert in ein Double umwandeln:
SELECT cast(20 as double) UNION SELECT null UNION SELECT 2.2;
oder stellen Sie sicher, dass Sie zuerst den doppelten Wert haben:
SELECT 2.2 UNION SELECT null UNION SELECT 22;
Weitere Beobachtungen nach dem Lesen der Kommentare in der Antwort von @Evan Carroll
select 20 union select null union select 2;
+------+
| 20 |
+------+
| 20 |
| NULL |
| 2 |
+------+
Ok, die Verwendung von int-Werten scheint den Fehler nicht zu erzeugen.
select 20 union select null union select 9.0;
+------+
| 20 |
+------+
| 9.9 |
| NULL |
| 9.0 |
+------+
FEHLER: Die Ausgabe scheint dezimal zu sein (2,1).
create table tmp as select * from (select 20 as x
union
select null
union
select 9.0) as t
describe tmp;
+-------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| x | decimal(2,1) | YES | | NULL | |
+-------+--------------+------+-----+---------+-------+
Der Fehler ist nicht auf die Befehlszeilenschnittstelle beschränkt, sondern existiert auch für python2-mysql-1.3.12-1.fc27.x86_64:
>>> import MySQLdb
>>> db = MySQLdb.connect(host="localhost", user="*****", passwd="*****", db="test")
>>> cur = db.cursor()
>>> cur.execute("SELECT 20 union select null union select 2.2")
3L
>>> for row in cur.fetchall() :
... print row
...
(Decimal('9.9'),)
(None,)
(Decimal('2.2'),)
Seltsamerweise verschwindet der Fehler, wenn null zuerst oder zuletzt verschoben wird:
select null union select 20 union select 9.0;
select 20 union select 9.0 union select null;
+------+
| NULL |
+------+
| NULL |
| 20.0 |
| 9.0 |
+------+
Wenn null an erster Stelle steht, ist der resultierende Typ dezimal (20,1). Wenn null gesetzt wird, ist der letzte resultierende Typ dezimal (3,1).
Der Fehler verschwindet auch, wenn der Vereinigung ein weiteres Bein hinzugefügt wird:
select 20 union select 6 union select null union select 9.0;
+------+
| 20 |
+------+
| 20.0 |
| 6.0 |
| NULL |
| 9.0 |
+------+
resultierende Typ Dezimalzahl (20,1)
Durch Hinzufügen einer weiteren Null in der Mitte bleibt der Fehler erhalten:
select 20 union select null union select null union select 9.0;
+------+
| 20 |
+------+
| 9.9 |
| NULL |
| 9.0 |
+------+
Das Hinzufügen einer Null am Anfang behebt das Problem:
select null union select 20 union select null union select null union select 9.0;
+------+
| NULL |
+------+
| NULL |
| 20.0 |
| 9.0 |
+------+
Wie erwartet funktioniert das Umwandeln des ersten Werts in eine Dezimalzahl (3,1).
Schließlich führt das explizite Umwandeln in eine Dezimalzahl (2,1) denselben Fehler aus, jedoch mit einer Warnung:
select cast(20 as decimal(2,1));
+--------------------------+
| cast(20 as decimal(2,1)) |
+--------------------------+
| 9.9 |
+--------------------------+
1 row in set, 1 warning (0.00 sec)