mysql order by null last_Mysql实现null值排在最前或最后
最近在做项目迁移,Oracle版本的迁到Mysql版本,遇到有些oracle的函数,mysql并没有,所以就只好想自定义函数或者找到替换函数的方法进行改造。
oracle做数据排序的时候,有时候可以用nulls first或者nulls last将null值排在最前或者最后。
oracle方法:
null值排在最前
select * from A order by a desc null first
null值排在最后
select * from A order by a desc null last
不过迁到Mysql的话,mysql并没有提供类似函数,所以要怎么实现?下面给出解决方法:
null值排在最后,用Mysql的IF和ISNULL函数。如果为空返回1,否返回0
select * from A order by IF(ISNULL(a),1,0),a desc
null值排在最前,用Mysql的IF和ISNULL函数。如果为空返回1,否返回0
select * from A order by IF(ISNULL(a),0,1),a desc
如果mybatis里需要oracle和Mysql版本的,或者可以从后台传个数据表版本标识dbType,或者直接用mybatis的_databaseId方法。
order by c.create_date desc nulls last
order by IF(ISNULL(c.create_date),1,0), c.create_date desc
NULL的意思表示什么都不是,或者理解成“未知”也可以,它与任何值比较的结果都是false
注意:
默认情况下,MySQL会认为NULL值比其他类型的数据小, 也就是说:在order by排序的时候,NULL是最小的。
前提:测试数据
id | age | name |
---|---|---|
1 | 12 | 张三 |
2 | 32 | 李四 |
3 | 22 | 王五 |
4 | NULL | 赵六 |
5 | 12 | 杨七 |
ASC正序排序
ASC默认NULL值是在最前面的
select * from user order by age asc;
执行结果:
id age name
4 NULL 赵六
1 12 张三
5 12 杨七
3 22 王五
2 32 李四
要想ASC排序让NULL在最后面,写法如下:
select * from user order by age is null asc ,age asc;
执行结果:
id age name
1 12 张三
5 12 杨七
3 22 王五
2 32 李四
4 NULL 赵六
DESC降序排序
默认NULL值是在最后面的
select * from user order by age desc;
执行结果:
id age name
2 32 李四
3 22 王五
1 12 张三
5 12 杨七
4 NULL 赵六
要想DESC排序让NULL在最前面,写法如下:
select * from user order by age is null desc ,age desc;
执行结果:
id age name
4 NULL 赵六
2 32 李四
3 22 王五
1 12 张三
5 12 杨七
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
2020-12-11 重构!重构!重构!