Как я могу использовать условие "ИЛИ" в выражении MySQL CASE?

У меня есть процедура, которая содержит выражение выражения CASE, например, так:

BEGIN
....
WHILE counter < total DO
....

 CASE ranking
  WHEN 1 OR 51 OR 100 OR 167 THEN SET
   project_name = 'alpha';
  WHEN 2 THEN SET
   project_name = 'beta';
  WHEN 10 OR 31 OR 40 OR 61 THEN SET
   project_name = 'charlie';
  ....
  ELSE SET
   project_name = 'zelta';
 END CASE;

 INSERT INTO project (id, name) VALUES (LAST_INSERT_ID(), project_name);
 SET counter = counter + 1;

END WHILE;
END
$$
DELIMITER ;

Когда я вызываю вышеуказанную процедуру, случаи с OR операторы либо пропускаются полностью, либо сопоставляется только первый элемент в списке. Что я делаю неправильно?

3 ответа

Решение
CASE ranking
  WHEN 1 THEN 'alpha' 
  WHEN 2 THEN 'beta'  
  WHEN 10 THEN 'charlie' 
  ELSE 'zelta' 
END CASE;

Вы можете использовать одно из выражений WHEN, но вы не можете смешать их оба.

1) WHEN when_expression - это простое выражение, с которым сравнивается input_expression, когда используется простой формат CASE. when_expression - любое допустимое выражение. Типы данных input_expression и каждого when_expression должны быть одинаковыми или неявным преобразованием.

2) WHEN Boolean_expression Логическое выражение, вычисляемое при использовании искомого формата CASE. Boolean_expression - любое допустимое логическое выражение.

Вы могли бы запрограммировать:

1)

 CASE ProductLine
         WHEN 'R' THEN 'Road'
         WHEN 'M' THEN 'Mountain'
         WHEN 'T' THEN 'Touring'
         WHEN 'S' THEN 'Other sale items'
         ELSE 'Not for sale'

2)

CASE 
         WHEN ListPrice =  0 THEN 'Mfg item - not for resale'
         WHEN ListPrice < 50 THEN 'Under $50'
         WHEN ListPrice >= 50 and ListPrice < 250 THEN 'Under $250'
         WHEN ListPrice >= 250 and ListPrice < 1000 THEN 'Under $1000'
         ELSE 'Over $1000'
      END

Но в любом случае вы можете ожидать, что переменное ранжирование будет сравниваться в логическом выражении.

http://msdn.microsoft.com/en-us/library/ms181765.aspx

Вы можете использовать, чтобы сравнить значения как числовые или символьные

CASE 
  WHEN ranking in(1,2,3) THEN '1Q' 
  WHEN ranking in(4,5,6) THEN '2Q'
  ELSE '3Q' 
END CASE;

CASE 
  WHEN ranking in('1','2','3') THEN '1Q' 
  WHEN ranking in('4','5','6') THEN '2Q'
  ELSE '3Q' 
END CASE;

это также будет работать в операторе выбора и хранимой процедуре.

select case when month(curdate()) in (4,5,6) then 1 when month(curdate()) in (7,8,9) then 2  else 3 end as fiscal_quarter ; 

Это также возможно: выберите (случай, когда (var1 = 0 или var2 = 1), затем 'x' else 'y' end) из ...

Другие вопросы по тегам