Как работает MySQL CASE?
Я знаю, что синтаксис SQL CASE
выглядит следующим образом:
CASE
WHEN search_condition THEN statement_list
[WHEN search_condition THEN statement_list] ...
[ELSE statement_list]
END CASE
Однако я не понимаю, как это работает, возможно, потому, что я думаю об этом как о выражении if
.
Если у меня есть поле в таблице user_role
, например, которое содержит такие имена, как "Менеджер", "Частичное время" и т.д., как мне создать поле role_order
с другим числом в зависимости от роли. В случае этого примера "если user_role =" Менеджер ", то role_order = 5".
Обратите внимание: я ищу научить человека, как ловить рыбу, а не давать человеку ответ рыбы.
Ответы
Ответ 1
CASE
больше похож на оператор switch. Он имеет два синтаксиса, которые вы можете использовать. Первый позволяет использовать любые требуемые выражения сравнения:
CASE
WHEN user_role = 'Manager' then 4
WHEN user_name = 'Tom' then 27
WHEN columnA <> columnB then 99
ELSE -1 --unknown
END
Второй стиль - это когда вы только изучаете одно значение и немного более кратким:
CASE user_role
WHEN 'Manager' then 4
WHEN 'Part Time' then 7
ELSE -1 --unknown
END
Ответ 2
CASE
в MySQL является оператором и выражением , где каждое использование немного отличается.
Как оператор, CASE
работает так же, как оператор switch, и полезен в хранимых процедурах, как показано в этом примере в документации (см. выше):
DELIMITER |
CREATE PROCEDURE p()
BEGIN
DECLARE v INT DEFAULT 1;
CASE v
WHEN 2 THEN SELECT v;
WHEN 3 THEN SELECT 0;
ELSE
BEGIN -- Do other stuff
END;
END CASE;
END;
|
Однако в качестве выражения он может использоваться в статьях:
SELECT *
FROM employees
ORDER BY
CASE title
WHEN "President" THEN 1
WHEN "Manager" THEN 2
ELSE 3
END, surname
Кроме того, как в качестве оператора, так и в качестве выражения, первый аргумент может быть опущен, и каждый WHEN
должен принять условие.
SELECT *
FROM employees
ORDER BY
CASE
WHEN title = "President" THEN 1
WHEN title = "Manager" THEN 2
ELSE 3
END, surname
Я дал этот ответ, потому что в другом ответе не упоминается, что CASE
может функционировать как выражение, так и выражение. Основное различие между ними заключается в том, что форма оператора заканчивается на END CASE
, а форма выражения заканчивается только END
.
Ответ 3
Мне нужен простой пример использования случая, с которым я мог бы играть, для этого даже не нужна таблица. Это возвращает нечетные или даже зависящие от того, являются ли секунды нечетными или даже
SELECT CASE MOD(SECOND(NOW()),2) WHEN 0 THEN 'odd' WHEN 1 THEN 'even' END;