2016-09-30 2 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"; 

ステートメントは目的のために機能しますが、私はケースステートメントで簡略化して結合したいと考えています。どんな助け?ありがとう。 MYSQLでテーブルを更新するためにケースステートメントを使用する

+1

何を試しましたか?いくつかの読書:http://stackoverflow.com/a/15745186/180100 –

答えて

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' 

をこれは、まず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'をインクルードするように変更された場合、MySQLは文字列リテラルではなく*識別子*(例えば列名)を囲むように二重引用符を解釈します。一重引用符は標準であり、 'sql_mode'の設定で動作します。文字列リテラルを二重引用符で囲むことで潜在的なメリットよりも大きな潜在的な落とし穴があります。 – spencer7593

+0

あなたは正しいです...私はすでに二重引用符で問題がありますが、私はいつもそのことを忘れています... – jmsf

0

CASE

は、CASE文には2つの構文があります

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がfalseであるため、NULLとの等価性のテストに使用できません。構文つに

説明:第2のシンタクスについて

、各節SEARCH_CONDITION発現が1になるまで評価された時点、そのTHEN対応句statement_listが実行される時、真です。 search_conditionが等しくない場合、ELSE節statement_listが存在すればそれが実行されます。

when_valueまたはsearch_conditionがテストされた値と一致せず、CASEステートメントにELSE句が含まれていない場合、CASEステートメントエラーではケースが見つかりません。

各statement_listは、1つ以上の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

構文2でELSE句に関する情報がどこから得られたのかは不明ですが、正確ではありません。 ELSE句を省略すると、when条件のいずれも満たされない場合、CASEは "returns"を意味します。クエリでCASEを使用するときは、BEGINとEND(CASE全体を終了しない)を含めるだけで問題が発生することは間違いありません。 _クエリのために使用された 'CASE WHEN condition'と手続き型ロジックのために使われたものを混同していたのでしょうか?_ – Uueerdo

+0

@Uueerdo私はmysql.comからの情報だけを持っています。私はこのプロジェクトのためにこの他の部分を使っています... –

関連する問題