我有一个表,我想通过考虑一些条件来更新特定列。例如,var1 将根据 columnC 字段获得不同的值。我使用下面的代码,在 MySQL Workbench 上没有收到错误,但有 0 行受到影响。当我运行脚本时,var1 不会改变。
update table
set number = columnA * columnB,
var1 = case
when lower(columnC) like '%aaa%' then var1 = number
when lower(columnC) like '%bbb%' then var1 = number * 2
when lower(columnC) like '%ccc%' then var1 = number * 4
else lower(columnC)
end,
var2 = number / var1
;
我尝试用不同的更新分别针对每种情况进行操作。
update table
set number = columnA * columnB;
效果很好。
update table
set var1 = number where lower(columnC) like 'aaa';
这根本不起作用。该列不受影响。我还尝试删除“lower”或放置特定的 field.value 而不是变量,但没有成功
最佳答案
您的查询有几个明显的问题。首先是 else
子句。
其次,case
中有 =
。这是一个 bool 比较,将返回 0 或 1。
但是,问题可能是您希望“按顺序”执行 set
子句。也就是说,您希望首先计算 number
,然后 var1
可以使用该数字,依此类推。但这并不是update
的工作原理(无论是在 MySQL 还是其他数据库中)。左侧的值来自“旧”记录。右侧的值在"new"记录中设置。
所以:
update table
set number = columnA * columnB,
var1 = columnA * columnB *
(case when lower(columnC) like '%aaa%' then 1
when lower(columnC) like '%bbb%' then 2
when lower(columnC) like '%ccc%' 4
else 1
end),
var2 = number / var1
var2 = (case when lower(columnC) like '%aaa%' then 1/1.0
when lower(columnC) like '%bbb%' then 1/2.0
when lower(columnC) like '%ccc%' 1/4.0
else 1.0
end);
我不确定 else
子句应该是什么。我只是将其设置为与“aaa”选项相同。
关于mysql - 使用案例更新 SQL 表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33125095/