web-dev-qa-db-ja.com

MySQL CASEはどのように機能しますか?

SQLのCASE構文は次のとおりです。

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

しかし、おそらくifステートメントについて考えているので、これがどのように機能するのか理解できません。

たとえば、「Manager」、「Part Time」などの名前を含むテーブルuser_roleにフィールドがある場合、役割に応じて異なる番号を持つフィールドrole_orderを生成するにはどうすればよいですか。この例の場合、「if user_role = 'Manager' then role_order = 5」。

男に魚を与える答えではなく、男に魚の釣り方を教える答えを探していることに注意してください。

63
JD Isaacks

CASE は、switchステートメントに似ています。使用できる構文は2つあります。 1つ目では、必要な比較ステートメントを使用できます。

CASE 
    WHEN user_role = 'Manager' then 4
    WHEN user_name = 'Tom' then 27
    WHEN columnA <> columnB then 99
    ELSE -1 --unknown
END

2番目のスタイルは、1つの値のみを検査する場合のためのもので、もう少し簡潔です。

CASE user_role
    WHEN 'Manager' then 4
    WHEN 'Part Time' then 7
    ELSE -1 --unknown
END
107
RedFilter

MySQLのCASEstatementexpression の両方であり、それぞれの使用法がわずかに異なります。

ステートメントとして、CASEはswitchステートメントのように機能し、ストアドプロシージャで役立ちます(上記のリンク先のドキュメントのこの例を参照)。

DELIMITER |

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

    CASE v
      WHEN 2 THEN SELECT v;
      WHEN 3 THEN SELECT 0;
      ELSE
        BEGIN -- Do other stuff
        END;
    END CASE;
  END;
  |

ただし、式として句で使用できます。

SELECT *
  FROM employees
  ORDER BY
    CASE title
      WHEN "President" THEN 1
      WHEN "Manager" THEN 2
      ELSE 3
    END, surname

さらに、ステートメントとしても式としても、最初の引数は省略でき、各WHENは条件を取得する必要があります。

SELECT *
  FROM employees
  ORDER BY
    CASE 
      WHEN title = "President" THEN 1
      WHEN title = "Manager" THEN 2
      ELSE 3
    END, surname

他の回答では、CASEがステートメントと式の両方として機能できるという言及がないため、この回答を提供しました。それらの主な違いは、ステートメント形式がEND CASEで終わり、式形式がENDで終わることです。

13
Svip

私は遊ぶことができるケースの使用の簡単な例を望んでいました、これはテーブルさえ必要としません。これは、秒が奇数か偶数かによって、奇数または偶数を返します

SELECT CASE MOD(SECOND(NOW()),2) WHEN 0 THEN 'odd' WHEN 1 THEN 'even' END;
1
zzapper