sql case when 中遇到的情况

今天写一个数据库的表操作,就是对表中2个不同字段根据条件进行修改,发现了一个问题:原始sql:

UPDATE open_route set 
dss=(case when dss LIKE '%ABUS_F@X16D,%' then REPLACE(dss,'ABUS_F@X16D,','' )
  when dss like '%,ABUS_F@X16D' then REPLACE(dss,',ABUS_F@X16D','')
	when dss ='ABUS_F@X16D' then ''
  else dss end),
status` = (case when dss ='ABUS_F@X16D' then 0 else status end)

where dss like '%ABUS_F@X16D%';

 在执行了该sql后,发现dss的值已经根据条件删除掉了ABUS_F@X16D 这个信息,但是status中的数值没有改变(有一条数据是只有这一个值,所以该条数据的status应该会变成0),思考了一下,发现是不是sql执行的时间顺序问题,即当我执行这条sql的时候,会先去做 
dss=(case when dss LIKE '%ABUS_F@X16D,%' then REPLACE(dss,'ABUS_F@X16D,','' )
  when dss like '%,ABUS_F@X16D' then REPLACE(dss,',ABUS_F@X16D','')
	when dss ='ABUS_F@X16D' then ''
  else dss end)
的操作,等这个执行完成后,才会去做

`status` = (case when dss ='ABUS_F@X16D' then 0 else status end)
的操作(即该case when 中的dss 是在已经改变后才来操作的,而不是在改变前已经将该dss的值引用过来)。

修改后的sql:

UPDATE open_route set 
`status` = (case when dss ='ABUS_F@X16D' then 0 else status end),
dss=(case when dss LIKE '%ABUS_F@X16D,%' then REPLACE(dss,'ABUS_F@X16D,','' )
  when dss like '%,ABUS_F@X16D' then REPLACE(dss,',ABUS_F@X16D','')
	when dss ='ABUS_F@X16D' then ''
  else dss end)
where dss like '%ABUS_F@X16D%'

想要改成正确的很简单,只需要将status的赋值放到前边即可,这也印证了我的猜想是正确的。

记录一下这个信息,防止以后出现相似问题不知道原因。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值