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

Always sort NULL as empty string or 0

我试图在我们的系统 ORDER BY 中进行所有查询,其中 NULL 和空字符串相等(仅在 ORDER BY 中)。我通过将 IFNULL(field, "") 添加到所有 GROUP BY 字段来解决这个问题。

现在的问题是,如果字段类型是数字,那么该字段将转换为 String,它将在 20 之前对 100 进行排序,因为它是按字母顺序排列的,而不是按数字排列的。如果我将“”更改为 0,它会将所有内容都转换为 int,这会使 varchar 字段的排序出错。

有没有一种通用的方式可以让我说 "if it is NULL, treat it as an empty string on ORDER BY"?或者,"if the field type is a string, use this function"?在这个简单的示例中,我可以根据字段切换辅助值,但我正在寻找更全局的解决方案。

示例table数据:

---------------
|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'' 取决于数据类型。

好吧,如果有人遇到这个 post,最好的方法就是使用 NULLIF 而不是 IFNULL 将所有 NULL 值转换为空字符串。

这仅在您处理字符串而不是 NULL 数字时有效。