以下はデモクエリです。base_priceが0の場合のみフェッチし、条件3を選択します。
SELECT
CASE course_enrollment_settings.base_price
WHEN course_enrollment_settings.base_price = 0 THEN 1
WHEN course_enrollment_settings.base_price<101 THEN 2
WHEN course_enrollment_settings.base_price>100 AND
course_enrollment_settings.base_price<201 THEN 3
ELSE 6
END AS 'calc_base_price',
course_enrollment_settings.base_price
FROM
course_enrollment_settings
WHERE course_enrollment_settings.base_price = 0
base_price
はdecimal(8,0)
です
DBでこれを実行すると、次のようになります。
3 0
3 0
3 0
3 0
3 0
CASE
の直後にあるcourse_enrollment_settings.base_price
を削除します。
SELECT
CASE
WHEN course_enrollment_settings.base_price = 0 THEN 1
...
END
CASE
には、 手動 で詳しく説明されている2つの異なる形式があります。ここでは、検索条件を使用しているため、2番目のフォームが必要です。
CASE case_value
WHEN when_value THEN statements
[WHEN when_value THEN statements]
ELSE statements
END
または:
CASE
WHEN <search_condition> THEN statements
[WHEN <search_condition> THEN statements]
ELSE statements
END
cASEは2番目のシナリオの式です。search_conditionは評価され、search_conditionが等しくない場合はelseを実行します
SELECT
CASE course_enrollment_settings.base_price
WHEN course_enrollment_settings.base_price = 0 THEN 1
あるべき
SELECT
CASE
WHEN course_enrollment_settings.base_price = 0 THEN 1
CASE course_enrollment_settings.base_price
はここでは間違っています。ただCASE
でなければなりません
SELECT
CASE
WHEN course_enrollment_settings.base_price = 0 THEN 1
WHEN course_enrollment_settings.base_price<101 THEN 2
WHEN course_enrollment_settings.base_price>100 AND
course_enrollment_settings.base_price<201 THEN 3
ELSE 6
END AS 'calc_base_price',
course_enrollment_settings.base_price
FROM
course_enrollment_settings
WHERE course_enrollment_settings.base_price = 0
いくつかの説明。元のクエリは次のように実行されます。
SELECT
CASE 0
WHEN 0=0 THEN 1 -- condition evaluates to 1, then 0 (from CASE 0)compares to 1 - false
WHEN 0<1 THEN 2 -- condition evaluates to 1,then 0 (from CASE 0)compares to 1 - false
WHEN 0>100 and 0<201 THEN 3 -- evaluates to 0 ,then 0 (from CASE 0)compares to 0 - true
ELSE 6, ...
それがあなたがいつも3を得る理由です
SELECT
CASE
WHEN course_enrollment_settings.base_price = 0 THEN 1
WHEN course_enrollment_settings.base_price>0 AND
course_enrollment_settings.base_price<=100 THEN 2
WHEN course_enrollment_settings.base_price>100 AND
course_enrollment_settings.base_price<201 THEN 3
ELSE 6
END AS 'calc_base_price',
course_enrollment_settings.base_price
FROM
course_enrollment_settings
WHERE course_enrollment_settings.base_price = 0
CASE
の2つのバリアント がありますが、自分が考えているものを使用していません。
CASE case_value
WHEN when_value THEN statement_list
[WHEN when_value THEN statement_list] ...
[ELSE statement_list]
END CASE
各条件は、if (case_value == when_value)
(擬似コード)とほぼ同等です。
ただし、条件全体をwhen_value
として設定しているため、次のような結果になります。
if (case_value == (case_value > 100))
現在、(case_value > 100)
はFALSE
に評価され、これが唯一の条件です。だから、今あなたは持っています:
if (case_value == FALSE)
FALSE
は0
に変換され、結果の完全な式if (case_value == 0)
により、3番目の条件が発生する理由を確認できます。
最初のcourse_enrollment_settings
を削除して、case_value
がなくなるようにします。これにより、MySQLは、CASE
の2番目のバリアントを使用することを認識します。
CASE
WHEN search_condition THEN statement_list
[WHEN search_condition THEN statement_list] ...
[ELSE statement_list]
END CASE
これで、完全な条件をsearch_condition
として提供できます。
また、使用する機能のドキュメントをお読みください。
その理由の1つは、CASE
の後に選択している値を指定し、その後CASE
を使用する2つの異なる方法の組み合わせであるWHEN x = y
構文を使用していることです。どちらかでなければなりません
CASE X
WHEN a THEN ...
WHEN b THEN ...
または
CASE
WHEN x = a THEN ...
WHEN x = b THEN ...