Как я могу использовать условие "ИЛИ" в выражении 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
Но в любом случае вы можете ожидать, что переменное ранжирование будет сравниваться в логическом выражении.
Вы можете использовать, чтобы сравнить значения как числовые или символьные
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) из ...