2009-09-16 59 views
1

我正在尋找解決方案/最佳做法來爲狀態標誌執行值交換。按位運算符的MySQL狀態交換

mysql中的狀態INT(3)有幾個值,我希望能夠交換LIVE和NOT_LIVE值,而不會中斷其中的其他按位值。

如果它是一個標誌字段,爲0或1,很容易:

'status' NOT 'status' 

我在想,如果有辦法,我可以根據兩個值(X,Y)做交換 - 沒有太多的代碼邏輯,就像上面的代碼一樣。當然,我可能是在做夢,只需要恢復到SELECT查詢,如果語句和UPDATE ...

任何想法?

+0

我想我們真的需要更多的例子在這裏能夠幫助您正確 – soulmerge 2009-09-16 11:30:43

+0

是,更多的例子將受到歡迎。例如,「狀態」有哪些不同的可能值,以及預期的結果是什麼?查看我更新的答案以獲取更多信息。 – 2009-09-17 03:03:28

回答

1

所以你的價值是1和2,但你要位風格翻轉?這將不起作用,因爲1和2有不同的位設置!

試試這個:

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

什麼意思是「交換[ping] LIVENOT_LIVE值」?如果LIVE有一點被設置/取消設置,那麼您正在尋找的是一個按位與非的NAND。舉例來說,如果它的值是8,你想未設置

UPDATE table SET status = status &~ 8 

將取消設置其值爲8。如果LIVENOT_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既不LIVENOT_LIVE,也不會被改變。

+0

通過交換我的意思是,如果狀態爲LIVE,那麼我希望它變成NOT_LIVE。 所以: LIVE = 1個 NOT_LIVE = 2 因此,如果「狀態」 = 1,然後變爲2.如果是2,那麼它就像我說的情況不只是狀態變爲1翻轉的價值,沒有發現/如果聲明/更新 - 它只是翻轉值... – frodosghost 2009-09-16 11:40:16

+0

我想我試圖避免IF或SWITCH。只是交換兩個值... – frodosghost 2009-09-16 11:46:06

0

您需要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