42

我想按照SQL:2003 扩展 T611NULLS LAST中的指定,使用所有 NULL 列最后()对我的结果进行排序。可悲的是,SQLite 似乎不支持它。有没有聪明的解决方法?

4

8 回答 8

34

这行得通吗?

SELECT ....... ORDER BY COALESCE(col1,col2,col3,etc) IS NULL

我对您的措辞“所有 NULL 列最后”感到困惑。如果您希望所有 NULL 值都在特定列中,请使用以下命令:

SELECT ....... ORDER BY col1 IS NULL
于 2012-09-19T21:26:49.770 回答
24

虽然我有点喜欢 Blorgbeard 的回答,但这个变体并不关心提供正确数据类型的有效“假”值。

ORDER BY CASE WHEN SOMECOL IS NULL THEN 1 ELSE 0 END, SOMECOL

或者,即使您想使用假值,我也更愿意IFNULL

ORDER BY IFNULL(SOMECOL,-9999)

正如迈克尔所说,SQLite 使用IFNULL. 您也可以使用 ANSI-SQL 通用版本COALESCE

于 2012-09-19T21:37:16.023 回答
17

SQLite 3.30.0+ 支持NULLS FIRST/LAST子句。

发布历史 (v3.30.0 - 2019-10-04)

  1. 在 ORDER BY 子句中添加对 NULLS FIRST 和 NULLS LAST 语法的支持。

订购方式

SQLite 认为 NULL 值小于任何其他值以进行排序。因此,NULL 自然地出现在 ASC order-by 的开头和 DESC order-by 的末尾。这可以使用“ASC NULLS LAST”或“DESC NULLS FIRST”语法进行更改。

SELECT * FROM t ORDER BY c NULLS LAST;

db-fiddle.com 演示

于 2019-10-05T08:49:18.897 回答
5

你可以做这样的事情来伪造它:

select * from test
order by case ordercol when null then 1 else 0 end, ordercol 
于 2012-09-19T21:29:29.050 回答
4

我遇到了同样的问题。我发现这可以工作:

(我没有找到isnullSQLite 的任何功能)

order by ifnull(column_what_you_want_to_sort,'value in case of null')
于 2016-04-01T13:13:06.030 回答
0

我的解决方案是反转priority列的范围并使用order by desc(按降序排序)。这会将空值一次性放在最后。

显然,这仅在您控制priority排序列时才有效,但是如果您可以摆动它,那就太好了!

如果这不起作用,我发现联合查询有效。只需两个查询并在第一个和第二个上union添加约束。第二个查询将在第一个查询的末尾。where not nullwhere null

于 2019-02-02T18:33:13.277 回答
0

在我的情况下,我想首先使用 NULL 列进行降序排序。我在查询后从 while 循环中将记录添加到列表中,所以我只是检查了该列是否为 NULL 并用于ArrayList.add(0, Object)实现此目的。

于 2019-09-02T12:11:36.897 回答
0

添加此答案以防有人在 3.30.0 之前的 SQLite 版本上寻找 ASC NULLS LAST 功能(特别是对于 TEXT 列)(因此它不可用)。

要将空值放在最后,请将它们替换为一个值,然后确保所有其他值都低于它:

SELECT * FROM customers ORDER BY
CASE
    WHEN Company IS NULL THEN '2'
    ELSE '1' || Company
END
ASC;

此外,对于 INTEGER 列,如果需要保持数字比较(而不是用文本切换字典),那么只需将 NULL 更改为一些文本。在 SQL 比较中 TEXT > INTEGER

SELECT * FROM customers ORDER BY
CASE
    WHEN IntegerColumn IS NULL THEN 'null'
    ELSE IntegerColumn
END
ASC;
于 2020-11-19T13:04:32.780 回答