SQL如何将空值和非空值排序

杨友山
博客专家认证
2012-06-14 11:19:00
是这样,需要按升序排序,但是有空值(在这里由于是数字型,所以空值都是0)结果空值就在最前面。想要的结果是所有按升序排序,但是空值放在最后。不过我只写了这个sql,将非空排在前面,空的排在后面

SELECT * from TB ORDER BY [列名] <>0 AND [列名]=0 DESC


但是结果里非空的是乱的,并不是按升序排的。

大家知不知道这个sql该如何写呢。

(如果实在没办法了我就只好在程序中循环整个DataTable用程序将空的放到最后)
...全文
884 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
nikolaichow 2012-06-14
  • 打赏
  • 举报
回复
order by isnull(列名,0)
ParanoidKing 2012-06-14
  • 打赏
  • 举报
回复
SQL Server的话可以这么写

SELECT * FROM TB ORDER BY (CASE WHEN [列名] > 0 THEN [列名] ELSE 9999 END)

9999换成你认为[列名]不可能达到的最大值
Access不支持CASE,但好像可以用IIF或SWITCH代替,试试这样

SELECT * FROM TB ORDER BY (IIF([列名] > 0, [列名], 9999))
天下如山 2012-06-14
  • 打赏
  • 举报
回复
貌似Access也支持union
熙风 2012-06-14
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

实在不行 就 2个select(一个非空升序 一个空) union下。
[/Quote]

+1
杨友山 2012-06-14
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
SQL code


select * from TB order by case when [列名] is null then (select isnull(MAX([列名]),0) from TB)+1 else [列名] end asc
[/Quote]

其实,我忘说我用的是access,不支持复杂的查询,如果需要用sql函数等处理的话,那我只好在程序里处理了。
ycproc 2012-06-14
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

SQL code

select * from TB order by case when [列名] is null then (select isnull(MAX([列名]),0) from TB)+1 else [列名] end asc
[/Quote]

这句话貌似有问题 只能过滤一个条件
应当用union
  • 打赏
  • 举报
回复

select * from TB order by case when [列名] is null then (select isnull(MAX([列名]),0) from TB)+1 else [列名] end asc
天下如山 2012-06-14
  • 打赏
  • 举报
回复
实在不行 就 2个select(一个非空升序 一个空) union下。

110,535

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧