SQL自增整数列,即使为空。

10

我有这个 SQL 语句:

update entity_table set views = views + 1 where id = {id of entity}

视图列是可空的。因此,只有当该列具有非空值时才起作用。

如果为 null,则如何使此语句将值设置为 1,并递增否则?

谢谢。


1
你的表格只有一行吗? - Aaron Bertrand
不好意思,该语句的其余部分包括 where id = {实体的id}。 - Richard
3个回答

22
UPDATE entity_table
SET    views = Coalesce(views, 0) + 1

为什么人们坚持使用专有的 IsNull() 而不是标准、更灵活和强大的 Coalesce() - gvee
Isnull比Coalesce更快。 - Rahul Tripathi
好的,当然可以先生:- http://weblogs.sqlteam.com/mladenp/articles/2937.aspx 和 https://dev59.com/pXE95IYBdhLWcg3wf98F - Rahul Tripathi
1
来自Adam Machanics文章的最后一行:“在我使用这些函数的场景中,几乎不值得为此牺牲功能和标准合规性”,这句话让我非常认同。 - gvee
2
天啊,你们真的认为专有的ISNULL在这种情况下真的会比COALESCE表现更好吗?提供的链接显示了混合的结果,我不认为有任何方法可以一概而论地说哪个在所有情况下都比另一个更快。性能不应该是你决定使用哪个的主要原因,除非你有一个非常特殊的情况,在这种情况下你发现你的选择不如另一个快... - Aaron Bertrand
显示剩余2条评论

5

先生,实际上我已经在其他答案的评论中写下了我的发现。如果您要求,我会将它们添加到我的答案中。 - Rahul Tripathi
请注意不要轻率地下定论——ISNULL并不总是比COALESCE更快,而您指出的链接甚至证明,在那个特定情况下,ISNULL比COALESCE更慢。 - Aaron Bertrand
哦,是的...我完全同意。它说有10到12%的差异。虽然我明白你的意思。非常感谢!! - Rahul Tripathi
1
SQLTeam的链接显示ISNULL比较慢,而Adam的测试(没有访问任何数据)则相反。因此,无论测试方向如何,10%到12%的差异意味着“ISNULL比COALESCE快”?这就是我所说的毯式陈述 - 将某些东西概括为听起来总是正确的,但实际上并非如此。 - Aaron Bertrand

2

我更喜欢其他两个答案,但这也可能对你在其他情况下有所帮助。

update entity_table
set views = CASE
                WHEN views IS NULL THEN 1
                ELSE views + 1
            END

我不明白,这个答案的执行速度比被接受的答案快得多,但它却没有被接受为最佳答案... - 71GA

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接