按日期排序显示NULLS首先是最近的日期
-
03-07-2019 - |
题
我有一个执行select语句的存储过程。我希望我的结果按日期字段排序,并显示所有记录首先是NULL日期,然后是最近的日期。
声明如下:
SELECT a,b,c,[Submission Date]
FROM someView
ORDER BY [Submission Date] ASC
现在这将首先显示所有带有空提交日期的记录,但是当我到达其中包含日期值的行时,它们不是视图中的最新日期。
如果我用DESC替换ASC,那么我按照我想要的顺序获取日期,但NULL值位于我的结果集的底部。
有没有办法构建我的查询,以便我可以在顶部显示空值,然后在有日期值时,按顺序将它们降序为最近的到最早的?
解决方案
@Chris,你几乎拥有它。
ORDER BY (CASE WHEN [Submission Date] IS NULL THEN 1 ELSE 0 END) DESC,
[Submission Date] DESC
[编辑:#Eppz让我调整上面的代码,如当前所示]
我个人更喜欢这比创造“魔术数字”更好。魔术数字几乎总是等待发生的问题。
其他提示
你可以做这样的事情把NULL放在底部:
ORDER BY [Submission Date] IS NULL DESC, [Submission Date] ASC
标准SQL(ISO / IEC 9075-2:2003或更高版本 - 2008)规定:
ORDER BY SomeColumn NULLS FIRST
大多数DBMS实际上并不支持这个,AFAIK。
试
SELECT a,b,c,[Submission Date]
FROM someView
ORDER BY isnull([Submission Date],cast('2079/01/01' as datetime)) ASC
OrderBy="ColumnName = NULL desc, ColumnName desc"
试试这个
选择a,b,c,[提交日期] 从 someView 订购 isnull([提交日期],演员('1770/01/01'作为日期时间))ASC
我知道这已经过时了,但是当我发现它时,我注意到了已接受的解决方案, https://stackoverflow.com/a/ 821856/7177892 ,可以通过使CASE语句的结果为今天(GETDATE())或实际日期来简化。
原件:
ORDER BY (CASE WHEN [Submission Date] IS NULL THEN 1 ELSE 0 END) DESC,
[Submission Date] DESC
简化为:
ORDER BY (CASE WHEN [Submission Date] IS NULL
THEN GETDATE()
ELSE [Submission Date]
END) DESC
不隶属于 StackOverflow