Перейти к основному содержимому
Модуль 4 · Урок 3 из 415/57 в курсе~10 min
Уроки модуля (3/4)

Условная логика: СЛУЧАЙ, КОГДА

Все, что мы видели до сих пор, извлекает данные как есть. Однако часто хочется трансформировать его: классифицировать зарплаты по уровням, отмечать новых сотрудников как «младший», переведите цифровой код в читаемую этикетку. стандарт SQL инструмент для этого называется CASE WHEN.

Синтаксис: мини if/else

SQL
CASE
  WHEN condition_1 THEN value_1
  WHEN condition_2 THEN value_2
  ...
  ELSE default_value
END

Он читается точно так же, как if/else if/else на любом языке: SQL оценивает условия по порядку и останавливается на первом истинном, возвращая соответствующий value. Если ни одно из них не истинно, возвращается значение ELSE. Если ты опустите ELSE и ни одна ветвь не будет соответствовать, он вернет NULL.

SQL
-- Classify employees by salary tier:
SELECT first_name,
       last_name,
       salary,
       CASE
         WHEN salary >= 50000 THEN 'Senior'
         WHEN salary >= 35000 THEN 'Mid'
         ELSE                       'Junior'
       END AS tier
FROM   employees;

CASE находится внутри SELECT: он создает столбец, как и любой другой функция, и совершенно нормально дать ей псевдоним AS (здесь tier).

Где использовать CASE

Три повторяющихся места:

  1. В SELECT создать производные столбцы (пример выше).
  2. В ORDER BY для «пользовательской» сортировки:
    SQL
    ORDER BY CASE department_id WHEN 1 THEN 0 ELSE 1 END, last_name;
    -- Engineering first, then the rest, alphabetically by last name.
  3. Внутри агрегатных функций для «условного подсчета»:
    SQL
    SELECT
      COUNT(*) AS total,
      SUM(CASE WHEN salary >= 50000 THEN 1 ELSE 0 END) AS senior,
      SUM(CASE WHEN salary <  35000 THEN 1 ELSE 0 END) AS junior
    FROM employees;
    Этот шаблон — SUM(CASE WHEN … THEN 1 ELSE 0 END) — является наиболее распространенным. «условный подсчет», используемый в информационных панелях.

«Компактная» форма

Существует также более короткий вариант, когда вы сравниваете одно выражение. против точных значений:

SQL
CASE department_id
  WHEN 1 THEN 'Ingegneria'
  WHEN 2 THEN 'Vendite'
  ELSE       'Altro'
END

Это эквивалентно CASE WHEN Department_id = 1 THEN ... WHEN Department_id = 2 THEN...END, просто компактнее. Это работает только для точного равенства: если вам нужно >= или другое сравнение, вам придется вернуться к расширенному форма.

Попробуйте это

Упражнение#sql.m4.l3.e1
Попыток: 0Загрузка…

Для каждого сотрудника укажите имя (first_name), фамилию (last_name) и столбец «Уровень», который имеет значение «Альто», если зарплата составляет не менее 50 000, в противном случае — «Стандарт». Три столбца, по одной строке на каждого сотрудника.

Загрузка редактора…
Показать подсказку

Условие: зарплата >= 50000. Не забудьте закрыть CASE с помощью END и использовать псевдоним «уровень».

Решение доступно после 3 попыток

Обзор упражнения

Упражнение#sql.m4.l3.e2
Попыток: 0Загрузка…

Для каждого отдела (department_id) подсчитайте, сколько сотрудников имеют высокую зарплату (>= 50000) и сколько стандартную (< 50000), используя SUM(CASE...). Три столбца: Department_id, высокий, стандартный. Упорядочить по Department_id (NULLS LAST).

Загрузка редактора…
Показать подсказку

Шаблон SUM(CASE WHEN ... THEN 1 ELSE 0 END) представляет собой условный подсчет.

Решение доступно после 3 попыток