如何在MySQL ORDER BY语句中处理'清空',0,NULL

时间:2014-09-13 00:42:31

标签: mysql sql null isnull sql-order-by

我正在使用一个我无法控制的数据库(第三方系统),其中一个表允许'featured'列为EMPTY,0,1或NULL。

任何状态EMPTY,0,NULL都意味着同样的事情。

我按“特色”列进行排序,然后按“名称”列进行排序,但结果数据不按字母顺序排列,除非按字母顺序列表中的“精选”分组。

FEATURED   |          NAME
--------------------------
1          | Apple
1          | Orange
0          | Avocado
0          | Banana
0          | Cauliflower
NULL       | Broccoli
NULL       | Potato
           | Cabbage

基本上,我需要将0,NULL,EMPTY视为相同的值,因此它们都按字母顺序排序。

理想输出示例

FEATURED   |          NAME
--------------------------
1          | Apple
1          | Orange
0          | Avocado
0          | Banana
NULL       | Broccoli
           | Cabbage
0          | Cauliflower
NULL       | Potato

2 个答案:

答案 0 :(得分:1)

如果你想要最后一次,我会用这样的表达式做到这一点:

order by (featured is null or featured = '0' or featured = ''),
         name

您可以将其简化为:

order by ((featured > 0) and featured is not null) desc, name

如果你愿意。

答案 1 :(得分:1)

要将'0' or '' or NULL值组合在一起,我会使用一个表达式"转换"其中两个值进入第三个,因此在所有三种情况下都返回相同的值。

featured列似乎是字符类型,因此我避免了不必要的隐式数据类型转换,而我的偏好是一个相当短的表达式。

要将NULL'0'转换为'',请先对行进行排序(按升序排列),我会执行以下操作:

  ORDER BY IFNULL(NULLIF(featured,'0'),''), name

如果我想返回NULL作为公共值(因此这些行按升序顺序排列),我将'''0'转换为{ {1}},像这样:

NULL