mysql 根据变量i的值去选择更新哪个字段 求问

tananfensi 2016-02-01 05:08:50
表名为bbb,表结构如下,一共4个字段b1,b2,b3,b4,记录数两条
b1 b2 b3 b4
1 2 3 4
2 4 6 8

我想根据变量i的值来选择要更新哪个字段,使该字段的值等于b4字段的值
当i=1时,使得b1=b4,即使得b1字段的值等于b4字段的值
当i=2时,使得b2=b4
当i=3时,使得b3=b4

但是我使用下面的语句的时候,mysql报错1064,菜鸟不懂怎么修改,请多指教
set @i=3;
update
bbb
set
CASE
WHEN @i= 1 THEN b1
WHEN @i = 2 THEN b2
ELSE b3
END
=
b4

但是我发现case when 语句用在select后面就可以,比如下面的语句(可是放在update set后面就不行,见上面语句,奇怪了)
set @i=3;
select
CASE
WHEN @i= 1 THEN b1
WHEN @i = 2 THEN b2
ELSE b3
END
from
bbb


再多问一个问题,加入上述语句写在一个procedure中,变量i前面就不用加@吗?我想用变量i在procedure中作为while循环的的变量。

...全文
242 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Ginnnnnnnn 2016-02-02
  • 打赏
  • 举报
回复
引用 5 楼 gudigudi 的回复:
有没有比用动态语句更简单的办法呢,求问
也是可以的。直接一句,跟动态语句其实差不多思路
set @i = 1;
update bbb set b1 = case when @i = 1 then b4 else b1 end,
				 b2 = case when @i = 2 then b4 else b2 END,
				  b2 = case when @i = 3 then b4 else b3 end
gudigudi 2016-02-02
  • 打赏
  • 举报
回复
有没有比用动态语句更简单的办法呢,求问
Ginnnnnnnn 2016-02-01
  • 打赏
  • 举报
回复
使用#2 方法用过程封装或者直接 或者使用动态语句来执行,参考
use test;
drop procedure if exists p1;
delimiter $$
create procedure p1()
begin 
set @ssql = '';
set @i=3;

select @ssql:=concat('update  bbb set ',CASE WHEN @i= 1 THEN 'b1' WHEN @i = 2 THEN 'b2' ELSE 'b3' END, '= b4');

prepare stmpStr from @ssql;
		execute stmpStr;
end$$
delimiter ;

call p1();
drop procedure p1;

tananfensi 2016-02-01
  • 打赏
  • 举报
回复
2楼这位大哥,谢谢你的回答,可是我是想把整个放入循环当中减少代码量,因为update的表中有个临时表是需要用变量i去 建立的,代码如下 delimiter $ drop procedure if exists aa; create procedure aa() begin declare i int; set i=1; while i<=3 do update bbb, ( select * FROM aaa where TO_DAYS(开始时间)=TO_DAYS(now())-(29-i) ) t set CASE WHEN i=1 b1 WHEN i=2 b2 ELSE b3 END = t.目标字段 where bbb.名称 = t.名称 set i=i+1; end while ; end $ call aa() $ 是因为update set语句中有一部分是需要while循环的变量i来建立临时表和bbb这个表去匹配的,如果用if的话代码会比较多,想直接用while循环来实现多个字段的更新,把case when 放在set后面,因为字段的实际数量比较多。不知道能否实现呢
在路上_- 2016-02-01
  • 打赏
  • 举报
回复
set @i=3; if @i= 1 update bbb set b1=b4 else if @i=2 update bbb set b2=b4 else if @i=3 update bbb set b3=b4
在路上_- 2016-02-01
  • 打赏
  • 举报
回复

set @i=3;
if @i= 1
  update bbb set b1=b4
else if @i=2
  update bbb set b2=b4
else if @i=3
  update bbb set b3=b4

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧