我想按照SQL:2003 扩展 T611NULLS LAST
中的指定,使用所有 NULL 列最后()对我的结果进行排序。可悲的是,SQLite 似乎不支持它。有没有聪明的解决方法?
8 回答
这行得通吗?
SELECT ....... ORDER BY COALESCE(col1,col2,col3,etc) IS NULL
我对您的措辞“所有 NULL 列最后”感到困惑。如果您希望所有 NULL 值都在特定列中,请使用以下命令:
SELECT ....... ORDER BY col1 IS NULL
虽然我有点喜欢 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
。
SQLite 3.30.0+ 支持NULLS FIRST/LAST
子句。
- 在 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;
你可以做这样的事情来伪造它:
select * from test
order by case ordercol when null then 1 else 0 end, ordercol
我遇到了同样的问题。我发现这可以工作:
(我没有找到isnull
SQLite 的任何功能)
order by ifnull(column_what_you_want_to_sort,'value in case of null')
我的解决方案是反转priority
列的范围并使用order by desc
(按降序排序)。这会将空值一次性放在最后。
显然,这仅在您控制priority
排序列时才有效,但是如果您可以摆动它,那就太好了!
如果这不起作用,我发现联合查询有效。只需两个查询并在第一个和第二个上union
添加约束。第二个查询将在第一个查询的末尾。where not null
where null
在我的情况下,我想首先使用 NULL 列进行降序排序。我在查询后从 while 循环中将记录添加到列表中,所以我只是检查了该列是否为 NULL 并用于ArrayList.add(0, Object)
实现此目的。
添加此答案以防有人在 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;