我正在尋找解決方案/最佳做法來爲狀態標誌執行值交換。按位運算符的MySQL狀態交換
mysql中的狀態INT(3)有幾個值,我希望能夠交換LIVE和NOT_LIVE值,而不會中斷其中的其他按位值。
如果它是一個標誌字段,爲0或1,很容易:
'status' NOT 'status'
我在想,如果有辦法,我可以根據兩個值(X,Y)做交換 - 沒有太多的代碼邏輯,就像上面的代碼一樣。當然,我可能是在做夢,只需要恢復到SELECT查詢,如果語句和UPDATE ...
任何想法?
我正在尋找解決方案/最佳做法來爲狀態標誌執行值交換。按位運算符的MySQL狀態交換
mysql中的狀態INT(3)有幾個值,我希望能夠交換LIVE和NOT_LIVE值,而不會中斷其中的其他按位值。
如果它是一個標誌字段,爲0或1,很容易:
'status' NOT 'status'
我在想,如果有辦法,我可以根據兩個值(X,Y)做交換 - 沒有太多的代碼邏輯,就像上面的代碼一樣。當然,我可能是在做夢,只需要恢復到SELECT查詢,如果語句和UPDATE ...
任何想法?
所以你的價值是1和2,但你要位風格翻轉?這將不起作用,因爲1和2有不同的位設置!
試試這個:
UPDATE table SET status = CASE status WHEN 1 THEN 2 ELSE 1 END
什麼意思是「交換[ping] LIVE
和NOT_LIVE
值」?如果LIVE
有一點被設置/取消設置,那麼您正在尋找的是一個按位與非的NAND。舉例來說,如果它的值是8,你想未設置它
UPDATE table SET status = status &~ 8
將取消設置其值爲8。如果LIVE
和NOT_LIVE
是兩個不同的位,那麼你就需要設置一個比特(或)並取消其他(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 因此,如果「狀態」 = 1,然後變爲2.如果是2,那麼它就像我說的情況不只是狀態變爲1翻轉的價值,沒有發現/如果聲明/更新 - 它只是翻轉值... – frodosghost 2009-09-16 11:40:16
我想我試圖避免IF或SWITCH。只是交換兩個值... – frodosghost 2009-09-16 11:46:06
您需要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
我想我們真的需要更多的例子在這裏能夠幫助您正確 – soulmerge 2009-09-16 11:30:43
是,更多的例子將受到歡迎。例如,「狀態」有哪些不同的可能值,以及預期的結果是什麼?查看我更新的答案以獲取更多信息。 – 2009-09-17 03:03:28