2016-05-18 6 views
1

Angenommen, Sie haben eine Spalte, die 1s, 0s und NULLs enthält. Sie mögen Gruppe von nur 1 und 0 und zählen NULL als 0, nur zwei und nicht drei Zeilen in der Ergebnismenge zu geben:GROUP BY auf Spaltenalias mit NULLs gibt falsches Ergebnis in MySQL zurück

SELECT SUM(aTable.whatever),IFNULL(aNullableTable.NullableColumn,0) AS TRUEORFALSE FROM aTable LEFT JOIN aNullableTable ON aTable.ID = aNullableTable.ID GROUP BY IFNULL(aNullableTable.NullableColumn,0); 
:

SELECT SUM(aTable.whatever),IFNULL(aNullableTable.NullableColumn,0) AS TRUEORFALSE FROM aTable LEFT JOIN aNullableTable ON aTable.ID = aNullableTable.ID GROUP BY TRUEORFALSE; 

In meiner Welt dies gleichwertig sein sollte

Allerdings ist es nicht. Das erste Beispiel kann drei Zeilen zurückgeben, wenn NULL in der Spalte vorhanden ist. Das zweite Beispiel gruppiert NULL korrekt als 0.

Bin ich hier etwas falsch verstanden oder ist das ein Fehler?

Es sollte beachtet werden, dass das Verhalten, wenn ersetzen IFNULL mit so etwas wie ähnelt:

IF(NullableColumn IS NULL,0,1), IF(NullableColumn<1,0,1) und IF(NullableColumn IS NOT NULL,1,0)

Beobachtet auf MySQL 5.7.11

Edit: Vielleicht sollte ich hinzufügen, dass Dies ist, wenn LINKE VERBINDUNG eine andere Tabelle, wo die NULL-Werte kommen. Ich habe nur das Beispiel bearbeitet.

Edit: Es stellte sich heraus, dass es war, weil ich SELECT IFNULL(NullableColumn,0) AS NullableColumn GROUP BY NullableColumn; verwendet hatte Dies ist keine gute Idee, für zukünftige Referenz, und wird ein sehr verwirrendes Ergebnis geben. Im obigen Beispiel würden Sie zwei Zeilen mit 0 und eins mit 1 anstelle von NULL, 0 und 1 erhalten, wie erwartet, wenn GROUP BY tatsächlich nicht richtig funktioniert. Wie dumm von mir.

+0

IFNULL() hat nur 2 Parameter und nicht 3 –

+0

Oh, ja, richtig. Es tut uns leid. Ich werde das einfach korrigieren. Offensichtlich ist es in meinem getesteten Code korrekt. – nickdnk

+0

http://sqlfiddle.com/#!9/c57094/2 Können Sie den Fehler in dieser Demo zeigen? –

Antwort

0

Ich glaube, dies könnte auftreten, wenn TRUEORFALSE eine Spalte in einer Tabelle in der FROM Klausel ist.

Der SQL-Standard erlaubt nicht die Verwendung von Spaltenaliasnamen in GROUP BY. Wenn also ein Name gefunden wird, der ein Spaltenname ist, sollte dies die erste Definition sein. Wenn keine übereinstimmende Spalte gefunden wird, kann MySQL nach einem Spaltenalias suchen.

+1

TRUEORFALSE ist keine Spalte in der Tabelle. Woher bekommst du auch, dass wir keinen Alias ​​in der Gruppe verwenden können? Ich glaube, dass Jürgen gerade eine SQL-Geige gepostet hat, die zeigt, dass das sehr gut möglich ist. Ich benutze es auch an anderen Stellen (nur nicht mit NULL-Spalten), wo es völlig in Ordnung ist. – nickdnk

+0

Es tut mir leid. Das war richtig. Ich habe gerade versucht, den Fehler zu finden (ich hatte ihn korrigiert, also musste ich ihn für den Zweck dieses Beitrags rekonstruieren) und es stellte sich heraus, dass das "AS [existingTableName]" tatsächlich das Problem war. Es überschreibt nicht, sondern macht GROUP BY *, während * NULL immer noch auf 0 gesetzt wird, was verwirrend ist - Sie würden zwei Zeilen mit 0 und eins mit 1 statt NULL, 0 und 1 erhalten. – nickdnk

+0

Immer noch verwirrt Dazu allerdings: "Der SQL-Standard erlaubt nicht die Verwendung von Spaltenaliasnamen in GROUP BY". – nickdnk