【发布时间】:2020-09-20 10:00:23
【问题描述】:
我有一个 postgres 执行字符串。我有一排用户,有一系列举重数据。我想更新当天的日志(即,如果今天已经记录了提升,则替换最后一个数组元素),或者将提升数据附加到这些数组中。
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;
首先检查日期(即最后一个日期数组元素)是否==今天的日期,如果为真,则将最后一个元素设置为给定值。
ELSE,将给定值附加到所有这些数组的末尾
我的 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”处或附近的语法错误
【问题讨论】:
-
这能回答你的问题吗? IF-THEN-ELSE statements in postgresql
-
我可以尝试使用 CASE,我只是不知道为什么这不起作用。还是想纠正我的误会!
-
好的,我会做一个CASE版本,看看会发生什么。
-
检查您的
SELECT语法。你在这里问了很多,因为你在中间切换到UPDATE,而且这包括很多其他垃圾。CASE的功能极其受限。 -
SELECT date[array_upper(date, 1)], (你最后错过了一个逗号)。但它似乎是 CTE 的候选者。
标签: sql postgresql go