我正在寻找一种解决方案/最佳实践来交换状态标志的值。
mysql 中的状态 INT(3) 有几个值,我希望能够交换 LIVE 和 NOT_LIVE 值,而不会中断其中的其他按位值。
如果是标志字段,如 0 或 1,则很简单:
'status' NOT 'status'
我想知道是否有一种方法可以基于两个值(x,y)进行交换 - 无需太多代码逻辑,如上面的代码。当然,我可能在做梦,只需要恢复到 SELECT 查询、if 语句和 UPDATE ......
有任何想法吗?
LIVE
“交换 [ping]和NOT_LIVE
值”到底是什么意思?如果LIVE
是设置/取消设置的位,那么您正在寻找的是按位 NAND。例如,如果它的值为 8 并且您想取消设置它
UPDATE table SET status = status &~ 8
它将取消设置值为 8 的位。如果LIVE
和NOT_LIVE
是两个不同的位,那么您需要设置一个 (OR) 并取消设置另一个 (NAND)。在这里,我将NOT_LIVE
在设置LIVE
(8) 的同时删除 (4)
UPDATE table SET status = (status &~ 4) | 8
如果status
只能有两个值,那么您需要添加这两个值然后减去status
。例如,如果这两个值是 1 和 2
UPDATE table SET status = (1 + 2) - status
你当然可以写
UPDATE table SET status = 3 - status
请注意,如果status
采用任何其他值,这将失败。您可以通过仅更改status
两者之一来避免这种情况。
UPDATE table SET status = 3 - status WHERE status IN (1, 2)
在这种情况下,如果status
既不是LIVE
或NOT_LIVE
,它也不会改变。
所以你的值是 1 和 2,但是你想要位式翻转?这行不通,因为 1 和 2 设置了不同的位!
试试这个:
UPDATE table SET status = CASE status WHEN 1 THEN 2 ELSE 1 END