我希望使用max(id)
在表格中获得许多行。当它返回NULL
时 - 如果表中没有行 - 我想返回0.当有行时我想返回max(id) + 1
。
我的行从0开始编号并自动增加。
以下是我的发言:
SELECT CASE WHEN MAX(id) != NULL THEN (MAX(id) + 1) ELSE 0 END FROM words
但它总是让我回复0.我做错了什么?
答案 0 :(得分:231)
答案 1 :(得分:13)
如果你想使用MAX(id)而不是count,在阅读了Pax的注释后,下面的SQL将为你提供你想要的东西
SELECT COALESCE(MAX(id)+1, 0) FROM words
答案 2 :(得分:9)
在SQL中,NULL = NULL为false,您通常必须使用IS NULL:
SELECT CASE WHEN MAX(id) IS NULL THEN 0 ELSE (MAX(id) + 1) END FROM words
但是,如果你想要行数,你应该只使用count(id)
,因为你的解决方案会给出10,如果你的行是(0,1,3,5,9)它应该给出5。 / p>
如果你可以保证你总是会有0到N的id,那么max(id)+1 可能会更快,具体取决于索引实现(遍历平衡的右侧可能会更快)数不过,而不是遍历整棵树。
但这是特定于实现的,我建议不要依赖它,尤其是因为它会将您的性能锁定到特定的DBMS。
答案 3 :(得分:4)
不确定我是否理解你的问题,但是max(id)根本不会给你行数。例如,如果你只有一行id = 13(假设你删除了前面的行),你将有max(id)= 13,但行数是1.正确(和最快)的解决方案是使用计数()。顺便说一句,如果你想知道为什么有一颗星星,那是因为你可以根据标准来计算线条。
答案 4 :(得分:2)
如果我正确理解你的问题我也遇到了同样的问题,我想知道在SQLite操作中每次插入性能之后的最后插入的id。我尝试了以下声明:
select * from table_name order by id desc limit 1
id是table_name的第一列和主键,上面提到的语句显示了id最大的记录。
但前提是你永远不会删除任何行,所以id的数量等于行数。
答案 5 :(得分:1)
扩展VolkerK的答案,为了使代码更具可读性,您可以使用AS来引用计数,例如:
SELECT COUNT(*) AS c from profile
这使得在某些框架中更容易阅读,例如,我使用Exponent' s(React Native)Sqlite集成,而没有AS语句,代码非常难看。