在Postgres中递增列中的空值

5
在PostgreSQL 9.3中,当表中的某个字段具有null值时,以下表达式将不起作用:
update table_statatistic set members = members + 1 WHERE user_id = $1; 

然而,当字段具有整数值时,此查询可以轻松地将其增加1。
问题是:
1. 为什么会发生这种情况。 2. 如何解决。

为什么?因为涉及到“null”的每个表达式都会产生“null”。这就是SQL的规定。https://modern-sql.com/concept/null - user330315
4
我认为你有这个问题是因为滥用了SQL NULL。正确的语义是“未知”,但你想将其视为0来处理。也许你应该在列定义中添加 DEFAULT 0 子句(并且顺带加上 NOT NULL)。这不仅可以解决你的问题,还可以使所有查询变得更简单易懂。 - Laurenz Albe
2个回答

13

你需要使用coalesce来检查空值

update table_statatistic set members = coalesce(members, 0) + 1 WHERE user_id = $1

2

使用COALESCE()代替: COALESCE函数返回其参数中第一个非空值。只有在所有参数都为null时才返回null。它经常用于在检索数据以供显示时,用默认值替换null值。

UPDATE table_statatistic SET members = COALESCE(members,0) + 1 WHERE user_id = $1; 

为什么我需要使用coalesce函数?Nothing + 1 = 1,这是为什么发生的? - Jimski
一个具有NULL值的字段是没有值的字段。因此,您不能将1添加到没有值的字段中。Null不是一个值。 - Jay Gupta
这是违反直觉的,毫无逻辑意义,null 表示什么都没有。在许多编程语言中,你可以很好地将整数加到 null 上。 - Jimski
1
你能告诉我编程语言的名称吗? - Jay Gupta
3
“null” 不等于 “0”,它们是两个截然不同的概念。 “null” 表示缺少任何信息。比如,如果我让你在你的飞船上增加一个椅子,那么此时你的飞船上会有几个椅子呢? - user330315
Gupta,我可以告诉你,在PHP中,例如,您可以将整数添加到null。A-horse...我知道null不是零,这就是为什么我在上面写了“nothing”的原因。不要试图用逻辑来解释这个问题,因为你的解释是不合逻辑的。如果null真的意味着没有信息,它也可以意味着Null字段保存了一个大整数,但我们只是不知道而已。通过查看字段null中的二进制数据,很明显这不是这种情况。你关于强类型语言的第二个解释更有道理,所以我点赞了你的评论。谢谢。 - Jimski

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