如何更新mysql查询中的标志位?

未知位

这是我的sql查询,在flag(00000)每个位都有不同的规范,例如change 4th bit position to 1 when user is inactive这里的标志是varchar datatype(String)。

$sql="select flag from user where id =1"

我有

flag=10001 #it may be flag="00001" or flag="00101"

我想将此标志的第二位更新为1。

$sql="update user set flag='-1---' where id=1" #it may be flag='11001' or flag='01001' or flag='01110'

实际上,我想将此标志的第二位更新为1,但不进行更新,例如flag ='11001'。我想做这样的事情。

$sql="update user set flag='--change(flag,2bit,to1)--' where id =1" #this is wrong

仅使用一个sql查询可以做什么?

巴尔玛
update user
set flag = lpad(conv((conv(flag, 2, 10) | 1 << 3), 10, 2), 5, '0')
where id = 1
  • conv(flag, 2, 10) 将标志字符串从二进制转换为十进制。
  • 1 << 3 向左移动1位3二进制位
  • |执行此操作的二进制或,以设置该位。此算术运算将自动将十进制字符串强制为数字;CAST如果愿意,可以使用显式
  • conv(..., 10, 2) 将十进制字符串转换回二进制字符串
  • lpad(..., 5, '0') 添加前导零以使字符串长5个字符

现场演示

要将位设置为0,请使用:

set flag = lpad(conv((conv(flag, 2, 10) & ~(1 << 3)), 10, 2), 5, '0')

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章