原始查询如下:
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。
最后一件事,我当然可以做一个相关的子选择来更新我的两个表,但是此时我有点迷茫。
输出必须是与备用调查回答的问题数量相匹配的整数。
有什么想法吗?
谢谢。
答案 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);
子句中添加一行即可。