遇到问题:
今天在开发中遇到一个有点奇葩的排序,两个表两个字段,加上一个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强制放在最后的语句的理解以此类推。
问题解决:
于是修改思路 问题解决