我想按照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
我遇到了同样的问题。我发现这可以工作:
(我没有找到isnullSQLite 的任何功能)
order by ifnull(column_what_you_want_to_sort,'value in case of null')
我的解决方案是反转priority列的范围并使用order by desc(按降序排序)。这会将空值一次性放在最后。
显然,这仅在您控制priority排序列时才有效,但是如果您可以摆动它,那就太好了!
如果这不起作用,我发现联合查询有效。只需两个查询并在第一个和第二个上union添加约束。第二个查询将在第一个查询的末尾。where not nullwhere 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;