SQL如何在升序排序时将空值放在最后

13 浏览
0 Comments

SQL如何在升序排序时将空值放在最后

我有一个带有日期时间字段的SQL表格。该字段可以为空。我有一个查询,我希望结果按照日期时间字段的升序排序,但是我希望日期时间字段为空的行排在列表的末尾,而不是开头。\n是否有简单的方法可以实现这个目标?

0
0 Comments

在排序时,如果希望空值出现在最后,可以使用下面的方法来解决。这个方法适用于MySQL和PostgreSQL数据库:

ORDER BY date IS NULL, date DESC

这个方法是从https://stackoverflow.com/a/7055259/496209找到的。

然而,尽管这个方法看起来很有希望,但遗憾的是,在我的MySQL数据库中,IS NULLIS NOT NULL并不能起到作用。

0
0 Comments

在SQL中,当对结果进行升序排序时,NULL值的排序位置是由具体的数据库管理系统(DBMS)决定的。有些DBMS将NULL值排在末尾,有些则将其排在开头。为了确保NULL值在排序结果中出现在末尾,可以使用"NULLS LAST"关键字。然而,并非所有的DBMS都支持"NULLS LAST",因此需要使用一些特定的方法来实现这个目标。

在标准SQL以及大多数现代DBMS(如Oracle、PostgreSQL、DB2、Firebird、Apache Derby、HSQLDB和H2)中,可以使用"NULLS LAST"或"NULLS FIRST"来控制NULL值的排序位置。下面是一些常用的方法:

1. 在某些DBMS中,可以直接在ORDER BY子句中使用"NULLS LAST"来将NULL值排序到末尾,例如:

SELECT *
FROM some_table
ORDER BY some_column DESC NULLS LAST

2. 在某些DBMS中,可以使用特定的函数来实现将NULL值排序到末尾的效果。例如,在Oracle中可以使用expr关键字来实现NULLS FIRST/LAST:

SELECT *
FROM some_table
ORDER BY expr some_column DESC NULLS LAST

3. 在某些DBMS中,可以使用ISNULL函数来将NULL值排序到末尾,例如在MSSQL中:

SELECT *
FROM some_table
ORDER BY ISNULL(some_column, 1), some_column ASC

需要注意的是,这些方法的适用性取决于具体的DBMS,不同的DBMS可能有不同的实现方式。因此,为了确保将NULL值排序到末尾,最好使用支持"NULLS LAST"关键字的DBMS,如Oracle、PostgreSQL、DB2、Firebird、Apache Derby、HSQLDB和H2。对于不支持"NULLS LAST"的DBMS,可以考虑使用其他函数或方法来实现相同的效果。

需要注意的是,升级到支持"NULLS LAST"的DBMS(如PostgreSQL)也是一种解决方法。

0
0 Comments

在SQL中,当对结果进行升序排序时,NULL值通常会排在最前面。然而,有时候我们希望将NULL值排在最后。下面是一个解决这个问题的方法:

select MyDate
from MyTable
order by case when MyDate is null then 1 else 0 end, MyDate

上述代码中,我们使用了一个`CASE`表达式。如果`MyDate`字段的值为NULL,我们将其映射为1,否则映射为0。然后,我们按照这个映射结果和`MyDate`字段进行排序。

然而,如果在排序的列上创建了索引以提高性能,这种方法会稍微复杂化查询计划,并且失去了很多性能优势。因此,最好在可能的情况下过滤掉NULL记录,以完全避免这个问题。

在这个的问题中,还提到了其他一些解决方法。例如,可以使用`ORDER BY MyDate IS NULL`来实现相同的效果。另外,还可以使用`NVL()`或`COALESCE()`函数来将NULL值映射为一个特定的值,然后进行排序。

总之,通过使用`CASE`表达式或其他函数来映射NULL值,并根据这个映射结果进行排序,我们可以将NULL值排在结果的最后。然而,需要注意的是,在性能要求较高的情况下,最好避免使用这种方法,而是尽量过滤掉NULL记录。

0