是否有简单的方法来实现这个需求?
select MyDate
from MyTable
order by case when MyDate is null then 1 else 0 end, MyDate
order by 0
被解释为列索引,而列索引是从1开始的。要按第三列排序查询,可以使用 order by 3
(这对于生产查询来说是一个可怕的想法),但在实验时非常方便(就像使用 *
一样)。 - D'Arcy RittichNULLS LAST
或NULLS FIRST
:NULLS LAST
将它们排序到末尾:select *
from some_table
order by some_column DESC NULLS LAST
NULLS FIRST
和NULLS LAST
,但在不同的数据库管理系统中并没有标准实现。根据数据库引擎的不同,可以使用以下命令进行排序:Oracle使用ORDER BY expr some_column DESC NULLS LAST
,MSSQL使用ORDER BY ISNULL(some_column, 1), some_column ASC
,而MySQL则使用不同的ISNULL()
实现,如ORDER BY ISNULL(some_column), some_column ASC
。请注意,这些命令只是针对特定的数据库引擎有效。 - SaschaM78NULLS LAST
,但它没有起作用。 - RedDragonWebDesign我也刚刚偶然发现了这个,并且以下内容对我在MySQL和PostgreSQL上似乎很有效:
ORDER BY date IS NULL, date DESC
IS NULL
和IS NOT NULL
没有起作用。 - RedDragonWebDesign如果您的引擎允许使用 ORDER BY x IS NULL, x
或者 ORDER BY x NULLS LAST
,请使用这些语句。但如果不支持这些语句,可以尝试以下方法:
如果您正在按数值类型排序,可以这样做:(从另一篇回答中借用模式。)
SELECT *
FROM Employees
ORDER BY ISNULL(DepartmentId*0,1), DepartmentId;
任何非空数字变为 0,而 null 变为 1,这使得 null 值最后排序,因为 0 < 1。
您也可以对字符串执行此操作:
SELECT *
FROM Employees
ORDER BY ISNULL(LEFT(LastName,0),'a'), LastName
任何非空字符串变成 ''
,而空值变成 'a'
,这样做是为了使空值排在最后,因为 ''
< 'a'
。
这个方法甚至适用于日期,通过将其强制转换为可为空的整数并使用上面的整数方法来实现:
SELECT *
FROM Employees
ORDER BY ISNULL(CONVERT(INT, HireDate)*0, 1), HireDate
(假装模式拥有HireDate架构。)
这些方法避免了必须为每种类型想出或管理“最大”值,或者在数据类型(和最大值)更改时修复查询的问题(其他ISNULL解决方案都存在这些问题)。此外,它们比CASE短得多。
您可以使用内置函数检查是否为null或非null,如下所示。我测试过了,它的工作正常。
选择 MyDate 从 MyTable 按 ISNULL(MyDate,1) DESC,MyDate ASC的顺序排列;
ISNULL(MyDate) DESC, MyDate ASC
来解析它,但它没有按正确的顺序排序。 - RedDragonWebDesignorder by coalesce(date-time-field,large date in future)
如果您的排序列是数字(如排名),则可以将其乘以-1,然后按降序排序。这样可以保持您期望的顺序,但将NULL放在最后。
select *
from table
order by -rank desc
NULLS FIRST
或NULLS LAST
:指定应该在非空值之前/之后返回NULL值:ORDER BY { column-Name | [ ASC | DESC ] | [ NULLS FIRST | NULLS LAST ] }
例如:
ORDER BY date DESC NULLS LAST
上面展示了两种按照NULL值排序的方法,你也可以将它们与ASC和DESC关键字结合使用。例如,获取NULL值排在前面的另一种方法是:Ordering
When you order by a field that may contain NULL values, any NULLs are considered to have the lowest value. So ordering in DESC order will see the NULLs appearing last. To force NULLs to be regarded as highest values, one can add another column which has a higher value when the main field is NULL. Example:
SELECT col1 FROM tab ORDER BY ISNULL(col1), col1;
Descending order, with NULLs first:
SELECT col1 FROM tab ORDER BY IF(col1 IS NULL, 0, 1), col1 DESC;
All NULL values are also regarded as equivalent for the purposes of the DISTINCT and GROUP BY clauses.
SELECT col1 FROM tab ORDER BY ISNULL(col1) DESC, col1;
-- ^^^^