我正在尝试使用ORDER BY
在系统NULL
中进行所有查询,并且空字符串相等(仅在ORDER BY中)。我通过将IFNULL(field, "")
添加到所有GROUP BY
字段来解决此问题。
现在的问题是,如果字段类型是数字,那么该字段将转换为String
,它将在20之前排序100,因为它按字母顺序排列,而不是按数字排序。如果我改变""为0,它将所有内容转换为int,这使得varchar
字段的排序出错。
是否有一种通用方式可以说"如果它是NULL,则将其视为ORDER BY上的空字符串"?或者,"如果字段类型是字符串,请使用此功能"?在这个简单的例子中,我可以根据字段切换次要值,但我正在寻找更全面的解决方案。
示例表数据:
---------------
|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;
答案 0 :(得分:0)
我很确定没有神奇的选择来做你想做的事。
但是,您可以考虑在DEFAULT
语句中使用CREATE TABLE
值,因此请避免使用NULL
值 - 只需将默认值设置为0
或''
取决于数据类型。
答案 1 :(得分:0)
如果有人发生在这篇文章中,那么最好的方法是使用NULLIF
代替IFNULL
将所有NULL值转换为空字符串。
这只适用于处理字符串而不是NULL数字时。