Как правильно использовать CASE..WHEN в MySQL
Вот демонстрационный запрос, обратите внимание, что это очень просто: выборки только там, где 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)
Когда вы запускаете это в моей БД, я получаю:
3 0
3 0
3 0
3 0
3 0
Ответы
Ответ 1
Удалите course_enrollment_settings.base_price
сразу после CASE
:
SELECT
CASE
WHEN course_enrollment_settings.base_price = 0 THEN 1
...
END
CASE
имеет две разные формы, как описано в руководстве . Здесь вам нужна вторая форма, так как вы используете условия поиска.
Ответ 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 - это выражение во втором сценарии. 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
Ответ 3
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
Ответ 4
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
Ответ 5
Есть два варианта CASE
, и вы не используете тот, который, по вашему мнению, есть.
Что вы делаете
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)
вы можете увидеть, почему срабатывает третье условие.
Что вы должны делать
Отбросьте первый course_enrollment_settings
, чтобы там не было case_value
, заставив MySQL знать, что вы собираетесь использовать второй вариант CASE
:
CASE
WHEN search_condition THEN statement_list
[WHEN search_condition THEN statement_list] ...
[ELSE statement_list]
END CASE
Теперь вы можете предоставить свои полные условные обозначения как search_condition
.
Кроме того, ознакомьтесь с документацией по функциям, которые вы используете.
Ответ 6
Я думаю, что часть этого состоит в том, что вы указываете значение, которое вы выбираете после CASE
, а затем после синтаксиса WHEN x = y
, который представляет собой комбинацию двух разных методов использования CASE
. Он должен быть либо
CASE X
WHEN a THEN ...
WHEN b THEN ...
или
CASE
WHEN x = a THEN ...
WHEN x = b THEN ...