我正在尝试在系统ORDER BY
中进行所有查询,其中NULL
和空字符串相等(仅在ORDER BY中)。我通过将IFNULL(field, "")
添加到所有GROUP BY
字段来解决这个问题。
现在的问题是,如果字段类型是数字,那么该字段将转换为String
,它将在20之前对100进行排序,因为它是按字母顺序排列的,而不是按数字排列的。如果我将"更改为0,它会将所有内容强制转换为int,从而导致varchar
字段的排序出错。
有没有一种通用的方法可以让我说"如果它是NULL,就把它当作ORDERBY上的空字符串"?或者,"如果字段类型是字符串,请使用此函数"?在这个简单的例子中,我可以根据字段切换次要值,但我正在寻找一个更全局的解决方案。
示例表数据:
---------------
|id|person|age|
|1 |Zzz |100|
|2 | |0 |
|3 |NULL |2 |
|4 | |2 |
---------------
一些例子:
//correct results
SELECT * FROM test ORDER BY IFNULL(`person`, ""), id ASC;
//null and empty strings not sorted properly
SELECT * FROM test ORDER BY IFNULL(`person`, 0), id ASC;
//correct results
SELECT * FROM test ORDER BY IFNULL(`age`, 0), id ASC;
//100 is turned to a string and therefor appears above 2
SELECT * FROM test ORDER BY IFNULL(`age`, ""), id ASC;
我很确定没有神奇的选项可以做你想做的事。
但是,您可能会考虑在CREATE TABLE
语句中使用DEFAULT
值,因此请避免使用NULL
值——只需根据数据类型将默认值设置为0
或''
即可。
如果有人看到这篇文章,最好的方法是使用NULLIF
而不是IFNULL
将所有NULL值转换为空字符串。
这只适用于处理字符串而不是NULL数字的情况。