这是我的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] 删除。
我来说两句