MySQL中order by 排序遇到NULL值的问题

  • Post author:
  • Post category:mysql




遇到问题:

今天在开发中遇到一个有点奇葩的排序,两个表两个字段,加上一个null值排序,更奇葩的是两个表的两个字段一个是数字,一个是中文,所以用了field关键字进行自定义排序.

我们知道NULL的意思表示什么都不是,或者理解成“未知”也可以,它与任何值比较的结果都是false,

我想把null放在后面,可是因为null值的特殊,网上搜了搜MySQL默认情况下null值比其他类型小(Oracle却相反,它认为null值为最大)

1、自定义排序:

是这样的

也就是说,在order by排序的时候,NULL是最小的,ASC正序排序的话,NULL值是在最前面的。

这就很尴尬了,于是继续搜,发现用is null操作符可以解决,

个人理解就是把null和!null给分别处理排序,在简单点说就是我们给null和非null分别排序在拼接(个人理解)

2、简单的有null值排序

如果想要手动指定null的顺序,可以使用:

1.将null强制放在最前:

if(isnull(字段名),0,1) asc //asc可以省略(默认升序)

2.将null强制放在最后

if(isnull(字段名),0,1) desc

if(isnull(字段名),1,0) asc //asc可以省略(默认升序)

对于这种使用方式的理解:

以if(isnull(字段名),0,1)为例,它的意思是将该字段根据是否为null值分成两部分,值为null行相当于得到了一个隐含的排序属性0,值为非null的行相当于得到了一个隐含的排序属性1,在排序的时候,先根据这一隐含属性进行升序排列,因为if(isnull(字段名),0,1)相当于if(isnull(字段名),0,1) asc省略了asc而已,所以自然地,排序字段为null的那些行(隐含排序属性)会在最前。

对于将null强制放在最后的语句的理解以此类推。




问题解决:

于是修改思路 问题解决

使用isnull




版权声明:本文为weixin_48142155原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。