登录
首页 >  Golang >  Go问答

Golang中的Postgres if/else语句语法错误

来源:stackoverflow

时间:2024-02-21 16:24:26 465浏览 收藏

目前golang学习网上已经有很多关于Golang的文章了,自己在初次阅读这些文章中,也见识到了很多学习思路;那么本文《Golang中的Postgres if/else语句语法错误》,也希望能帮助到大家,如果阅读完后真的对你学习Golang有帮助,欢迎动动手指,评论留言并分享~

问题内容

我有一个 postgres exec 字符串。我有成排的用户,其中包含举重数据数组。我想更新当天的日志(即,如果今天已经记录了提升,则替换最后一个数组元素),或者将提升数据附加到这些数组。

begin
if (select date[array_upper(date, 1)] from userdata where email = $8) = $7 then
update userdata set age = $1,
weight[array_upper(weight, 1)] = $2,
deadlift[array_upper(deadlift, 1)] = $3,
squat[array_upper(squat, 1)] = $4,
bench[array_upper(bench, 1)] = $5,
overhead[array_upper(overhead, 1)] = $6,
where email = $8;
else
update userdata set age = $1,
weight = array_append(weight, $2),
deadlift = array_append(deadlift, $3),
squat = array_append(squat, $4),
bench = array_append(bench, $5),
overhead = array_append(overhead, $6),
date = array_append(date, $7)
where email = $8;
end if;
end;

首先检查日期(即最后一个日期数组元素)是否==今天的日期,如果为真,则将最后一个元素设置为给定值。

否则,将给定值附加到所有这些数组的末尾

我的golang代码如下:

_, err := d.conn.exec(context.background(), execstring, user.age, user.weight, user.deadlift, user.squat,
        user.bench, user.overhead, fmt.sprint(time.now().date()), user.email)

使用以下变量执行 execstring(第一个代码块)。

错误:错误:“if”处或附近的语法错误

刚接触 golang 和 postgres,希望得到一些帮助(问题可能出在我的 execstring 上)

编辑(下面的案例版本):

SELECT date[array_upper(date, 1)]
CASE
WHEN date[array_upper(date,1)] = $7 THEN
UPDATE userdata SET age = $1,
weight[array_upper(weight, 1)] = $2,
deadlift[array_upper(deadlift, 1)] = $3,
squat[array_upper(squat, 1)] = $4,
bench[array_upper(bench, 1)] = $5,
overhead[array_upper(overhead, 1)] = $6,
WHERE email = $8;
ELSE
UPDATE userdata SET age = $1,
weight = array_append(weight, $2),
deadlift = array_append(deadlift, $3),
squat = array_append(squat, $4),
bench = array_append(bench, $5),
overhead = array_append(overhead, $6),
date = array_append(date, $7)
WHERE email = $8;
END
FROM userdata WHERE email = $8

错误:错误:“case”处或附近的语法错误


解决方案


这是我为解决问题所做的事情(希望它可以帮助其他尝试做类似事情的人)

似乎 case 不能用于决定运行哪个语句,而似乎只能决定将哪些文本放入查询/执行字符串中。因此,我必须移动一些东西才能做到这一点,使用 case 来决定将数组设置为等于什么,而不是决定对数组执行什么操作。

UPDATE userdata
SET age = $1,
weight = CASE WHEN date[array_upper(date,1)] = $7 THEN array_replace(weight, weight[array_upper(weight, 1)], $2) 
ELSE array_append(weight, $2) END,
deadlift = CASE WHEN date[array_upper(date,1)] = $7 THEN array_replace(deadlift, deadlift[array_upper(deadlift, 1)], $3) 
ELSE array_append(deadlift, $3) END,
squat = CASE WHEN date[array_upper(date,1)] = $7 THEN array_replace(squat, squat[array_upper(squat, 1)], $4) 
ELSE array_append(squat, $4) END,
bench = CASE WHEN date[array_upper(date,1)] = $7 THEN array_replace(bench, bench[array_upper(bench, 1)], $5) 
ELSE array_append(bench, $5) END,
overhead = CASE WHEN date[array_upper(date,1)] = $7 THEN array_replace(overhead, overhead[array_upper(overhead, 1)], $6) 
ELSE array_append(overhead, $6) END,
date = CASE WHEN date[array_upper(date,1)] = $7 THEN array_replace(date, date[array_upper(date, 1)], $7) 
ELSE array_append(date, $7) END
WHERE email = $8;

今天带大家了解了的相关知识,希望对你有所帮助;关于Golang的技术知识我们会一点点深入介绍,欢迎大家关注golang学习网公众号,一起学习编程~

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>