始终将NULL排序为空字符串或0

时间:2015-12-08 12:49:51

标签: mysql sorting sql-order-by

我正在尝试使用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;

2 个答案:

答案 0 :(得分:0)

我很确定没有神奇的选择来做你想做的事。

但是,您可以考虑在DEFAULT语句中使用CREATE TABLE值,因此请避免使用NULL值 - 只需将默认值设置为0''取决于数据类型。

答案 1 :(得分:0)

如果有人发生在这篇文章中,那么最好的方法是使用NULLIF代替IFNULL将所有NULL值转换为空字符串。

这只适用于处理字符串而不是NULL数字时。

相关问题