用 ISNULL 和操作更新

Update with ISNULL and operation

原始查询如下所示:

UPDATE reponse_question_finale t1, reponse_question_finale t2 SET 
t1.nb_question_repondu = (9-(ISNULL(t1.valeur_question_4)+ISNULL(t1.valeur_question_6)+ISNULL(t1.valeur_question_7)+ISNULL(t1.valeur_question_9))) WHERE t1.APPLICATION = t2.APPLICATION;

我知道您不能在单个查询中更新 2 个表,所以我尝试了这个:

UPDATE reponse_question_finale t1
  SET nb_question_repondu = (9-(COALESCE(t1.valeur_question_4,'')::int+COALESCE(t1.valeur_question_6,'')::int+COALESCE(t1.valeur_question_7)::int+COALESCE(t1.valeur_question_9,'')::int)) 
WHERE t1.APPLICATION = t1.APPLICATION;

但是这个查询给了我一个错误:invalid input syntax for integer: ""

我看到 Postgres 等同于 MySQL 是 COALESCE() 所以我认为我在这方面做得很好。
我也知道你不能将 varchar 添加到 varchar 所以我试图将它转换为整数来做到这一点。我不确定我是否在合适的地方用括号正确地投射了它,关于错误,我可能无法用 coalesce 投射到 int。
最后一件事,我当然可以做一个相关的子 select 来更新我的两个表,但我现在有点迷路了。

输出必须是与备份调查中回答的问题数匹配的整数。

有什么想法吗?

谢谢。

coalesce() returns 所提供列表中的第一个非空值。因此,如果列值为空,则表达式 COALESCE(t1.valeur_question_4,'') return 是一个空字符串,这就是您收到错误的原因。

但您似乎想要完全不同的东西:您想要检查该列是否为 null(或空),然后减去一个值以计算非空列的数量。

到 return 1 如果值不为空或 0 如果不是,你可以使用:

(nullif(valeur_question_4, '') is null)::int 

nullif return如果第一个值等于第二个,则为空。 IS NULL 条件 return 是 boolean(MySQL 没有的东西)并且可以转换为整数(其中 false 将转换为0true1)

所以整个表达式应该是:

nb_question_repondu = 9 - (
                              (nullif(t1.valeur_question_4,'') is null)::int
                            + (nullif(t1.valeur_question_6,'') is null)::int
                            + (nullif(t1.valeur_question_7,'') is null)::int
                            + (nullif(t1.valeur_question_9,'') is null)::int
                          )

另一种选择是取消旋转列并在子 select:

中对它们执行 select
update reponse_question_finale
  set nb_question_repondu = (select count(*) 
                              from (
                                values 
                                  (valeur_question_4), 
                                  (valeur_question_6), 
                                  (valeur_question_7), 
                                  (valeur_question_9)
                              ) as t(q) 
                              where nullif(trim(q),'') is not null);

添加更多要考虑的列非常容易,因为您只需要在 values() 子句中添加一行