1

我正在寻找一种解决方案/最佳实践来交换状态标志的值。

mysql 中的状态 INT(3) 有几个值,我希望能够交换 LIVE 和 NOT_LIVE 值,而不会中断其中的其他按位值。

如果是标志字段,如 0 或 1,则很简单:

'status' NOT 'status'

我想知道是否有一种方法可以基于两个值(x,y)进行交换 - 无需太多代码逻辑,如上面的代码。当然,我可能在做梦,只需要恢复到 SELECT 查询、if 语句和 UPDATE ......

有任何想法吗?

4

3 回答 3

1

LIVE“交换 [ping]和NOT_LIVE值”到底是什么意思?如果LIVE是设置/取消设置的位,那么您正在寻找的是按位 NAND。例如,如果它的值为 8 并且您想取消设置

UPDATE table SET status = status &~ 8

它将取消设置值为 8 的位。如果LIVENOT_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既不是LIVENOT_LIVE,它也不会改变。

于 2009-09-16T11:26:06.113 回答
1

所以你的值是 1 和 2,但是你想要位式翻转?这行不通,因为 1 和 2 设置了不同的位!

试试这个:

UPDATE table SET status = CASE status WHEN 1 THEN 2 ELSE 1 END
于 2009-09-16T14:17:00.980 回答
0

你需要这里的case语句

UPDATE table SET status = CASE
    WHEN status = 1 THEN 2
    WHEN status = 2 THEN 3
    ELSE 1
END CASE

或者,如果您愿意,可以使用if 语句

UPDATE table SET status =
    IF     status = 1 THEN 2
    ELSEIF status = 2 THEN 3
    ELSE   1
END IF
于 2009-09-16T12:03:13.743 回答