用 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
将转换为0
和 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
)
另一种选择是取消旋转列并在子 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()
子句中添加一行
原始查询如下所示:
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
将转换为0
和 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
)
另一种选择是取消旋转列并在子 select:
中对它们执行 selectupdate 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()
子句中添加一行