2016-09-30 87 views
3
UPDATE crm_accounts 
SET 
    reg = "Sim" 
WHERE age >= 17 
AND age <= 35 
AND balance > 0.00 
AND type = "Júnior"; 


UPDATE crm_accounts 
SET 
    reg = "Não" 
WHERE age >= 17 
AND age <= 35 
AND balance = 0.00 
AND type = "Júnior"; 


UPDATE crm_accounts 
SET 
    type = "Efetivo" 
WHERE age >= 17 
AND age <= 35 
AND type = "Júnior"; 

該聲明適用於此目的,但我想在case語句中進行簡化和組合。任何幫助?謝謝。用例語句更新表

+1

你試過了什麼?一些閱讀:http://stackoverflow.com/a/15745186/180100 – 2016-09-30 16:34:04

回答

2

它看起來像你想是這樣的:

UPDATE crm_accounts a 
    SET a.reg 
     = CASE 
      WHEN a.balance > 0.00 THEN 'Sim' 
      WHEN a.balance = 0.00 THEN 'Não' 
      ELSE a.reg 
     END 
     , a.type = 'Efetivo' 
    WHERE a.age >= 17 
    AND a.age <= 35 
    AND a.type = 'Júnior' 

每當我寫更新語句LIK e,我總是首先在SELECT語句中測試表達式和謂詞,然後驗證結果。在將其轉換爲UPDATE語句之前,我確定一切都按我需要的方式工作。

SELECT a.age >= 17 
     , a.type 
     , a.reg AS old_reg 
     , CASE 
      WHEN a.balance > 0.00 THEN 'Sim' 
      WHEN a.balance = 0.00 THEN 'Não' 
      ELSE a.reg 
     END AS new_reg 
    FROM crm_accounts a 
    WHERE a.age >= 17 
    AND a.age <= 35 
    AND a.type = 'Júnior' 
+0

工作就像一個魅力。謝謝你的一切@ spencer7593。 – jmsf

+1

注意:我建議您使用*單引號*而不是雙引號*來包含字符串文字。是的,MySQL確實允許將字符串文字用雙引號引起來。但其他數據庫不。在MySQL中,如果'sql_mode'改爲包含'ANSI_QUOTES',那麼M​​ySQL將解釋雙引號以包含* not *字符串,而是*標識符*(例如列名)。單引號是標準的,可以用於任何'sql_mode'設置。圍繞字符串使用雙引號的潛在缺陷超過了任何潛在的好處。 – spencer7593

+0

你是對的...我已經有雙引號的問題,但我總是忘記... – jmsf

0
CASE

在發言MYSQL

有兩種語法CASE語句

SYNTAX 1:

CASE case_value 
    WHEN when_value THEN statement_list 
    [WHEN when_value THEN statement_list] ... 
    [ELSE statement_list] 
END CASE 

SYNTAX 2:

CASE 
    WHEN search_condition THEN statement_list 
    [WHEN search_condition THEN statement_list] ... 
    [ELSE statement_list] 
END CASE 

上語法一個解釋:

對於所述第一語法,case_value是一個表達式。將該值與每個WHEN子句中的when_value表達式進行比較,直到其中一個相等。如果找到相等的when_value,則執行相應的THEN子句statement_list。如果沒有when_value相等,則執行ELSE子句statement_list(如果有)。

此語法不能用於測試與NULL的相等性,因爲NULL = NULL爲false。

說明上語法二:

對於第二語法,每個WHEN子句search_condition表達式進行求值,直到有一個爲真,指向其對應THEN子句STATEMENT_LIST執行處。如果沒有search_condition相等,則執行ELSE子句statement_list(如果有)。

如果沒有when_value或search_condition與測試值匹配且CASE語句不包含ELSE子句,則沒有找到CASE語句錯誤結果的Case。

每個statement_list由一個或多個SQL語句組成;一個空的statement_list是不允許的。

要處理沒有任何WHEN子句匹配值的情況,請使用包含空的BEGIN ... END塊的ELSE,如本例所示。 (ELSE子句中這裏使用的縮進僅僅是爲了清楚起見,並沒有其他顯著。)

DELIMITER | 

CREATE PROCEDURE p() 
    BEGIN 
    DECLARE v INT DEFAULT 1; 

    CASE v 
     WHEN 2 THEN SELECT v; 
     WHEN 3 THEN SELECT 0; 
     ELSE    
     END; 
    END CASE; 
    END; 
    | 

並且代碼可以使用CASE語句這樣的更新..

UPDATE `crm_accounts` SET `reg` = CASE 

WHEN age >= 17 
AND age <= 35 
AND balance > 0.00 
AND type = "Júnior" THEN "Sim" 

WHEN age >= 17 
AND age <= 35 
AND balance = 0.00 
AND type = "Júnior" THEN "Não" 

WHEN age >= 17 
AND age <= 35 
AND type = "Júnior" THEN "Efetivo" 

ELSE `reg` 

END 
+0

嗨Naresh。感謝您的快速響應和解釋。 – jmsf

+2

不確定從何處獲得關於語法二中的ELSE子句的信息,但它不準確。省略ELSE子句僅意味着如果沒有滿足條件,則CASE「返回」null;並且在查詢中使用CASE時,我相當肯定只要包含BEGIN和END(即不會終止整個CASE)會導致問題。 _您可能會混淆'用於查詢的CASE WHEN條件'以及用於程序邏輯的條件嗎?_ – Uueerdo

+0

@Uererdo。我已經從單獨的mysql.com獲得了信息,並且我已經使用了這個其他部分來完成我的一個項目... –