我想对结果进行排序,最后所有NULL列(NULLS LAST
),如SQL:2003 extension T611中所指定。可悲的是,SQLite似乎不支持它。有一个聪明的解决方法吗?
这行得通吗?
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)
正如Michael指出的,SQLite使用IFNULL
。您也可以使用ANSI-SQL通用版本COALESCE
。
您可以执行以下操作来伪造它:
select * from test
order by case ordercol when null then 1 else 0 end, ordercol
我遇到了同样的问题。我发现这可行:
((我没有找到SQLite的任何isnull
函数)
order by ifnull(column_what_you_want_to_sort,'value in case of null')
我的解决方案是反转priority
列的范围并使用order by desc
(以降序排列)。一口气将null放在末尾。
显然,这只有在您控制priority
排序列时才有效,但是如果您可以摆动它,那就太好了!
如果不起作用,我发现并集查询有效。只需union
两个查询,然后在第一个查询上添加约束where not null
,在第二个查询上添加约束where null
。第二个查询将在第一个查询的末尾。
就我而言,我想先对NULL列进行降序排序。我在查询后从while循环中将记录添加到列表中,因此我只是检查该列是否为NULL并使用ArrayList.add(0, Object)
实现此目的。
SQLite 3.30.0+支持NULLS FIRST/LAST
子句。
Release History (v3.30.0 - 2019-10-04)
- [在ORDER BY子句中添加对NULLS FIRST和NULLS LAST语法的支持。
SQLite出于排序目的,认为NULL值小于任何其他值。因此,NULL自然会出现在ASC排序开始时和DESC排序结束时。 可以使用“ ASC NULLS LAST”或“ DESC NULLS FIRST”语法进行更改。