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」。
男に魚を与える答えではなく、男に魚の釣り方を教える答えを探していることに注意してください。
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
MySQLのCASE
は statement と expression の両方であり、それぞれの使用法がわずかに異なります。
ステートメントとして、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
で終わることです。
私は遊ぶことができるケースの使用の簡単な例を望んでいました、これはテーブルさえ必要としません。これは、秒が奇数か偶数かによって、奇数または偶数を返します
SELECT CASE MOD(SECOND(NOW()),2) WHEN 0 THEN 'odd' WHEN 1 THEN 'even' END;