这是我的sql查询,在flag(00000)每个位位置都有不同的规范,例如change 4th bit position to 1 when user is inactive.这里标志是varchar数据类型(String).
$sql="select flag from user where id =1"
Run Code Online (Sandbox Code Playgroud)
我有
flag=10001 #it may be flag="00001" or flag="00101"
Run Code Online (Sandbox Code Playgroud)
我想将此标志的第2位更新为1.
$sql="update user set flag='-1---' where id=1" #it may be flag='11001' or flag='01001' or flag='01110'
Run Code Online (Sandbox Code Playgroud)
实际上,我想将这个标志的第2位更新为1,但不要像flag ='11001'那样更新它.我想做这样的事情.
$sql="update user set flag='--change(flag,2bit,to1)--' where id =1" #this is wrong
Run Code Online (Sandbox Code Playgroud)
我能做些什么,只使用一个SQL查询?有可能吗?
update user
set flag = lpad(conv((conv(flag, 2, 10) | 1 << 3), 10, 2), 5, '0')
where id = 1
Run Code Online (Sandbox Code Playgroud)
conv(flag, 2, 10) 将标志字符串从二进制转换为十进制.1 << 3 将1位3个二进制位移到左侧|执行此二进制OR,以设置该位.此算术运算会自动将十进制字符串强制转换为数字; CAST如果您愿意,可以使用明确的.conv(..., 10, 2) 将十进制字符串转换回二进制字符串lpad(..., 5, '0') 添加前导零以使字符串长5个字符要将该位设置为0,请使用:
set flag = lpad(conv((conv(flag, 2, 10) & ~(1 << 3)), 10, 2), 5, '0')
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4254 次 |
| 最近记录: |