使用ISNULL和操作进行更新

时间:2018-08-21 09:00:44

标签: postgresql sql-update postgresql-9.5

原始查询如下:

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: ""

我看到与MySQL等效的Postgres是COALESCE(),所以我认为我在这里很好。
我也知道您不能将varchar添加到varchar中,因此我尝试将其强制转换为integer来做到这一点。我不确定是否在正确的位置使用括号正确地转换了它,并且考虑到错误,也许我无法通过合并转换为int。
最后一件事,我当然可以做一个相关的子选择来更新我的两个表,但是此时我有点迷茫。

输出必须是与备用调查回答的问题数量相匹配的整数。

有什么想法吗?

谢谢。

1 个答案:

答案 0 :(得分:0)

coalesce()返回提供的列表中的第一个非空值。因此,如果列值为空,则表达式COALESCE(t1.valeur_question_4,'')返回一个空字符串,这就是为什么会出现错误的原因。

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

要返回1(如果值不为空)或0(如果不是),可以使用:

(nullif(valeur_question_4, '') is null)::int 
如果第一个值等于第二个值,则

nullif返回null。 IS NULL条件返回一个boolean(MySQL没有的东西),并且可以将其强制转换为整数(其中false将强制转换为0和{{ 1}}至true

因此整个表达式应为:

1

另一种选择是取消旋转列并在子选择中对其进行选择:

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
                          )

那么,添加更多要考虑的列就非常容易了,因为您只需要在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); 子句中添加一行即可。