web-dev-qa-db-ja.com

ケース式とケースステートメント

MySQLの ケース式ケースステートメント の違いは何ですか?それらはいつ使用でき、一方を他方より使用することの利点は何ですか?

Caseステートメントの構文:

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

ケース式の構文:

CASE 
  WHEN [condition] THEN result 
  [WHEN [condition] THEN result ...] 
  [ELSE result] 
END

これらはほとんど同じように見えますが、Caseステートメントの最初の説明はThe CASE statement for stored programs implements a complex conditional construct.

では、ストアドプログラムで使用され、通常のクエリでは使用できないという大きな違いはありますか?私が遊んでいたクエリでこれを試してみましたが、失敗しました- sqlfiddle 。ただし、これが当てはまる場合は、ストアドプログラムでCase Expressionを使用しないのはなぜですか。

同じように見えるので、他に注意すべき構文上の違いはありますか?

41
mrmryb

CASE式は値に評価されます。つまり、何らかの条件に基づいて、結果セットの1つに評価するために使用されます。
例:

SELECT CASE
    WHEN type = 1 THEN 'foo'
    WHEN type = 2 THEN 'bar'
    ELSE 'baz'
END AS name_for_numeric_type
FROM sometable`

CASEステートメントは、条件に基づいて、一連のステートメントの1つを実行します。
例:

CASE
    WHEN action = 'update' THEN
        UPDATE sometable SET column = value WHERE condition;
    WHEN action = 'create' THEN
        INSERT INTO sometable (column) VALUES (value);
END CASE

どのように似ているかはわかりますが、ステートメントdoesは値に評価され、単独で使用できますが、式は式の一部である必要があります。クエリまたは割り当て。クエリにはステートメントを含めることができないため、クエリでステートメントを使用することはできません。何かに評価する必要がある式(クエリ自体はある意味でステートメントです)、たとえばSELECT CASE WHEN condition THEN UPDATE table SET something; END CASE 意味がありません。

63
lanzz