Как правильно использовать CASE..Когда в 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
is decimal(8,0)
при запуске этого на моей БД я получаю:
3 0
3 0
3 0
3 0
3 0
6 ответов
удалить course_enrollment_settings.base_price
сразу после CASE
:
SELECT
CASE
WHEN course_enrollment_settings.base_price = 0 THEN 1
...
END
CASE
имеет две разные формы, как подробно описано в руководство. Здесь вам нужна вторая форма, так как вы используете условия поиска.
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
здесь случай является выражением во 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
, и вы не используете тот, который вы думаете, что вы.
что ты делаешь
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
.
кроме того, пожалуйста, прочитайте документация по используемым функциям.
Я думаю, что вы с указанием стоимости вы выбираете после CASE
, а затем с помощью WHEN x = y
синтаксис после этого, который представляет собой комбинацию двух разных методов использования CASE
. Это должно быть либо
CASE X
WHEN a THEN ...
WHEN b THEN ...
или
CASE
WHEN x = a THEN ...
WHEN x = b THEN ...