2010-02-01 60 views
32

如何在條件評估爲True時更新表並設置不同的值。MySQL - 在MySQL UPDATE或SELECT查詢中使用If If Then

例如:

UPDATE Table 
SET A = '1' IF A > 0 AND A < 1 
SET A = '2' IF A > 1 AND A < 2 
WHERE A IS NOT NULL; 

我已經看到了過程和函數CASE表達式和IF表達,但我想在一個簡單的更新/ SELECT語句中使用它。是否有可能或者我對這個可愛的開源數據庫期待過多?

回答

41
UPDATE table 
SET A = IF(A > 0 AND A < 1, 1, IF(A > 1 AND A < 2, 2, A)) 
WHERE A IS NOT NULL; 

您可能需要使用CEIL()如果A始終是一個浮點值> 0<= 2

+0

值只是舉例。我想將它應用於任何條件。例如:如果一個IS NOT NULL SET設置爲'Some Varchar Value'ELSE SET設置爲'Some Other Varchar Value';我會給你的解決方案一個鏡頭,看看它是如何工作的。非常感謝! – ThinkCode 2010-02-01 15:58:49

+0

你有沒有參考你在做什麼?我目前看不到它.. – inetphantom 2015-04-01 09:45:28

6

這裏有一個查詢更新基於另一個表的比較表。如果tableB中沒有找到記錄,它會將「活動」值更新爲「n」。如果發現,將值設爲NULL

UPDATE tableA 
LEFT JOIN tableB ON tableA.id = tableB.id 
SET active = IF(tableB.id IS NULL, 'n', NULL)"; 

希望這可以幫助別人。

16

雖然你肯定可以使用MySQL的IF()控制流功能as demonstrated by dbemerlin's answer,我懷疑這可能是一個更清晰一點的讀者(即自己和未來的任何開發誰可以拿起您在未來的代碼)使用CASE表達式代替:

UPDATE Table 
SET A = CASE 
     WHEN A > 0 AND A < 1 THEN 1 
     WHEN A > 1 AND A < 2 THEN 2 
     ELSE A 
     END 
WHERE A IS NOT NULL 

當然,在該特定示例中它是一個小的浪費設置A到本身在ELSE子句更好完全過濾從UPDATE這樣的條件下,經由WHERE子句:

UPDATE Table 
SET A = CASE 
     WHEN A > 0 AND A < 1 THEN 1 
     WHEN A > 1 AND A < 2 THEN 2 
     END 
WHERE (A > 0 AND A < 1) OR (A > 1 AND A < 2) 

(不等式需要A IS NOT NULL)。

或者,如果你想要的時間間隔被關閉,而不是開(注意 - 如果這是不可取的,這將設置01,該WHERE子句中人們可以明確地篩選這樣的情況下,否則增加一個更高優先WHEN條件):

UPDATE Table 
SET A = CASE 
     WHEN A BETWEEN 0 AND 1 THEN 1 
     WHEN A BETWEEN 1 AND 2 THEN 2 
     END 
WHERE A BETWEEN 0 AND 2 

雖然,作爲dbmerlin還指出,對於這種特定情況下,你可以考慮使用替代CEIL():A中的

UPDATE Table SET A = CEIL(A) WHERE A BETWEEN 0 AND 2 
+1

這是一個更簡潔的演示文稿,即使有兩個以上的條件也可以普遍使用。 @dbemerlin提供的'if()'語句解決方案需要嵌套兩個條件,這會使邏輯更難以閱讀和理解。 – 2015-07-29 00:53:05