具有NULL的列别名的GROUP BY在MySQL中返回不正确的结果

时间:2016-05-18 01:12:18

标签: mysql group-by aggregate-functions

假设您有一个包含1s,0和NULL的列。您希望仅将1和0分组并将NULL计数为0,从而在结果集中只提供两行而不是三行:

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

在我的世界中,这应该相当于:

IF(NullableColumn IS NULL,0,1)

但事实并非如此。如果列中有NULL,则第一个示例可能返回三行。第二个示例正确地将NULL组合为0。

我在这里误解了什么或者这是一个错误吗?

应该注意的是,如果用以下的方式替换IFNULL,行为是相似的:

IF(NullableColumn<1,0,1)IF(NullableColumn IS NOT NULL,1,0)SELECT IFNULL(NullableColumn,0) AS NullableColumn GROUP BY NullableColumn;

在MySQL 5.7.11上观察

编辑:也许我应该补充说,这是LEFT JOIN&另一个NULL值进入的表。我刚编辑了这个例子。

编辑:原来是因为我使用了{{1}}这不是一个好主意,供将来参考,并且会给出一个非常令人困惑的结果。在上面的示例中,如果GROUP BY实际上无法正常工作,则会获得两行0和1,而不是NULL,0和1。傻我。

1 个答案:

答案 0 :(得分:0)

我相信如果TRUEORFALSEFROM子句中表格中的列,就可能发生这种情况。

SQL标准不允许在GROUP BY中使用列别名。因此,如果遇到名称是列名,那么它应该是它的第一个定义。然后,如果找不到匹配的列,MySQL可以查找列别名。