假设您有一个包含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。傻我。
答案 0 :(得分:0)
我相信如果TRUEORFALSE
是FROM
子句中表格中的列,就可能发生这种情况。
SQL标准不允许在GROUP BY
中使用列别名。因此,如果遇到名称是列名,那么它应该是它的第一个定义。然后,如果找不到匹配的列,MySQL可以查找列别名。