Dav*_*jak 280 sql sorting sql-order-by
我有一个带有日期时间字段的SQL表.有问题的字段可以为null.我有一个查询,我希望结果按日期时间字段按升序排序,但是我想要在列表末尾的日期时间字段为空的行,而不是在开头.
有没有一种简单的方法来实现这一目标?
Red*_*ter 373
select MyDate
from MyTable
order by case when MyDate is null then 1 else 0 end, MyDate
Run Code Online (Sandbox Code Playgroud)
a_h*_*ame 152
("有点"迟到,但这根本没有提到)
您没有指定DBMS.
在标准SQL(以及大多数现代DBMS,如Oracle,PostgreSQL,DB2,Firebird,Apache Derby,HSQLDB和H2)中,您可以指定NULLS LAST或NULLS FIRST:
用于NULLS LAST将它们排序到最后:
select *
from some_table
order by some_column DESC NULLS LAST
Run Code Online (Sandbox Code Playgroud)
Luk*_*ous 32
我也偶然发现了这一点,以下似乎对我来说,在MySQL和PostgreSQL上的诀窍:
ORDER BY date IS NULL, date DESC
Run Code Online (Sandbox Code Playgroud)
Gra*_*tzy 14
order by coalesce(date-time-field,large date in future)
Run Code Online (Sandbox Code Playgroud)
小智 13
您可以使用内置函数检查null或not null,如下所示.我测试它,它的工作正常.
select MyDate from MyTable order by ISNULL(MyDate,1) DESC, MyDate ASC;
inf*_*lch 12
如果您的引擎允许ORDER BY x IS NULL, x或ORDER BY x NULLS LAST使用它.但如果不是这些可能会有所帮助:
如果您按数字类型排序,则可以执行以下操作:(从另一个答案中借用模式.)
SELECT *
FROM Employees
ORDER BY ISNULL(DepartmentId*0,1), DepartmentId;
Run Code Online (Sandbox Code Playgroud)
任何非空数字都将变为0,空值变为1,最后对空值进行排序.
您也可以为字符串执行此操作:
SELECT *
FROM Employees
ORDER BY ISNULL(LEFT(LastName,0),'a'), LastName
Run Code Online (Sandbox Code Playgroud)
因为'a'> ''.
这甚至可以通过强制转换为可空int并使用上面的int方法来处理日期:
SELECT *
FROM Employees
ORDER BY ISNULL(CONVERT(INT, HireDate)*0, 1), HireDate
Run Code Online (Sandbox Code Playgroud)
(让我们假装架构有HireDate.)
这些方法避免了必须提出或管理每种类型的"最大"值的问题,或者如果数据类型(和最大值)发生变化(两个ISNULL解决方案都受到影响),则必须修复查询.而且它们比CASE短得多.
当您的订单栏是数字(如排名)时,您可以将其乘以-1然后按顺序递减.它将保持您预期的顺序,但最后将NULL设置为NULL.
select *
from table
order by -rank desc
Run Code Online (Sandbox Code Playgroud)
在 Oracle 中,您可以使用NULLS FIRSTor NULLS LAST: 指定应在非 NULL 值之前/之后返回 NULL 值:
ORDER BY { column-Name | [ ASC | DESC ] | [ NULLS FIRST | NULLS LAST ] }
Run Code Online (Sandbox Code Playgroud)
例如:
ORDER BY date DESC NULLS LAST
Run Code Online (Sandbox Code Playgroud)
参考:http://docs.oracle.com/javadb/10.8.3.0/ref/rrefsqlj13658.html
小智 5
SELECT *
FROM Employees
ORDER BY ISNULL(DepartmentId, 99999);
Run Code Online (Sandbox Code Playgroud)
请参阅此博客文章。

如果您使用的是 MariaDB,他们会在NULL 值文档 中提到以下内容。
订购
当您按可能包含 NULL 值的字段排序时,任何 NULL 都被视为具有最低值。因此,按 DESC 顺序排序将看到最后出现的 NULL。为了强制将 NULL 视为最高值,可以添加另一列,当主字段为 NULL 时,该列具有更高的值。例子:
Run Code Online (Sandbox Code Playgroud)SELECT col1 FROM tab ORDER BY ISNULL(col1), col1;降序,首先是 NULL:
Run Code Online (Sandbox Code Playgroud)SELECT col1 FROM tab ORDER BY IF(col1 IS NULL, 0, 1), col1 DESC;就 DISTINCT 和 GROUP BY 子句而言,所有 NULL 值也被视为等效。
上面显示了两种按 NULL 值排序的方法,您也可以将它们与 ASC 和 DESC 关键字结合使用。例如,首先获取 NULL 值的另一种方法是:
SELECT col1 FROM tab ORDER BY ISNULL(col1) DESC, col1;
-- ^^^^
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
225733 次 |
| 最近记录: |