【问题标题】:MySQL status swap for bitwise operators位运算符的 MySQL 状态交换
【发布时间】:2010-11-28 18:36:12
【问题描述】:

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

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

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

'status' NOT 'status'

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

有什么想法吗?

【问题讨论】:

  • 我认为我们真的需要更多的例子来帮助你正确
  • 是的,欢迎提供更多示例。例如,status 的不同可能值是什么?预期的结果是什么?有关更多信息,请参阅我的更新答案。

标签: php mysql replace status swap


【解决方案1】:

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

UPDATE table SET status = status &~ 8

它将取消设置值为 8 的位。如果 LIVENOT_LIVE 是两个不同的位,那么您需要设置一个 (OR) 并取消设置另一个 (NAND)。这里我将删除NOT_LIVE (4) 同时设置LIVE (8)

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,则不会更改。

【讨论】:

  • 通过交换我的意思是,如果状态为 LIVE,那么我希望它更改为 NOT_LIVE。所以:LIVE = 1 NOT_LIVE = 2 所以如果'status' = 1,那么它会变成2。如果它是2,那么它会变成1。正如我所说,状态NOT状态只是翻转值,没有find/if 语句/更新 - 它只是翻转值...
【解决方案2】:

您需要case statement

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

如果您愿意,也可以使用if statement

UPDATE table SET status =
    IF     status = 1 THEN 2
    ELSEIF status = 2 THEN 3
    ELSE   1
END IF

【讨论】:

    【解决方案3】:

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

    试试这个:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-27
      • 1970-01-01
      • 2011-05-08
      • 2012-09-14
      • 2017-06-23
      • 2021-03-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多