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

Как работает 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".

Обратите внимание: я ищу научить человека, как ловить рыбу, а не давать человеку ответ рыбы.

4b9b3361

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