Подтвердить что ты не робот

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

4b9b3361

Ответ 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 ...