如何在SQLite中运行NULLS?

时间:2012-09-19 21:23:45

标签: sql sqlite null

我想在SQL:2003 extension T611中指定的所有NULL列(NULLS LAST)对结果进行排序。可悲的是,SQLite似乎不支持它。有一个聪明的解决方法吗?

8 个答案:

答案 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)

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

  

ORDER BY

     

出于排序目的,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;