Как правильно использовать 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 ...