我想在SQL:2003 extension T611中指定的所有NULL列(NULLS LAST
)对结果进行排序。可悲的是,SQLite似乎不支持它。有一个聪明的解决方法吗?
答案 0 :(得分:21)
这可行吗?
SELECT ....... ORDER BY COALESCE(col1,col2,col3,etc) IS NULL
我对你的措辞“所有空列最后”感到困惑。如果要将特定列中的所有NULL值保留为最后一个,请使用:
SELECT ....... ORDER BY col1 IS NULL
答案 1 :(得分:19)
虽然我有点像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
。
答案 2 :(得分:4)
你可以做这样的事情来伪造它:
select * from test
order by case ordercol when null then 1 else 0 end, ordercol
答案 3 :(得分:4)
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”语法进行更改。
答案 4 :(得分:2)
我遇到了同样的问题。 我发现这可行:
(我没有为SQLite找到任何isnull
函数)
order by ifnull(column_what_you_want_to_sort,'value in case of null')
答案 5 :(得分:0)
我的解决方案是反转priority
列的范围并使用order by desc
(降序排列)。在一个去年底这使得空。
很明显,这只有在您控制priority
排序列的情况下才有效,但是如果您可以摆动它,那就太好了!
如果这不起作用,我发现一个联合查询有效。只需union
两个查询,并在第一个查询上添加约束where not null
,然后在第二个查询上添加约束where null
。第二个查询将在第一个查询的末尾。
答案 6 :(得分:0)
在我的情况下,我想先对NULL列进行降序排序。我要在查询后从while循环中将记录添加到列表中,因此我只是检查该列是否为NULL并使用ArrayList.add(0, Object)
来实现。
答案 7 :(得分: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;