Добавил:
СПбГУТ * ИКСС * Программная инженерия Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Основное / Письменные лекции по дисциплине «Базы данных».docx
Скачиваний:
89
Добавлен:
29.11.2021
Размер:
713.33 Кб
Скачать

3.4. Операторы if и case

Оператор IF реализует базовую конструкцию условия, он должен заканчиваться точкой с запятой. Существует также функция IF(), которая отличается от оператора IF. Вот синтаксис оператора IF:

IF условие THEN оператор(ы)

[ELSEIF условие THEN оператор(ы)] ...

[ELSE оператор(ы)]

END IF

Если условие выполняется, выполняются операторы соответствующих блоков THEN или ELSE IF.

Если условие не удовлетворяется, выполняются операторы блока ELSE. Каждый оператор состоит из одного или нескольких операторов SQL; пустые операторы не допускается.

Оператор CASE используется для создания внутри хранимой процедуры MySQL сложной условной конструкции. Оператор CASE не может содержать блок ELSE NULL и должен закрываться END CASE, а не END. Синтаксис:

CASE значение

WHEN значение THEN список_операторов

[WHEN значение THEN список_операторов] ...

[ELSE список_операторов] END CASE

или:

CASE

WHEN условие_поиска THEN список_операторов

[WHEN условие_поиска THEN список_операторов] ...

[ELSE список_операторов] END CASE

Пояснение: первый синтаксис.

Значение — это выражение, которое сравнивается со значением в каждом блоке WHEN, пока они не будут равны. При найденном соответствии значений выполняется список_операторов соответствующего блока THEN.

Если значения не равны, тогда выполняется список_операторов блока ELSE, если таковой имеется.

Пояснение: второй синтаксис.

Каждое выражение блока условие_поиска оценивается, пока одно из них не будет истинно. В этот момент выполняется список_операторов соответствующего блока THEN.

Если ни одно из выражений условие_поиска не истинно, тогда выполняется список_операторов блока ELSE, если таковой имеется. Каждый список_операторов состоит из одного или нескольких операторов SQL; пустой список_операторов не допускается.

Пример использования CASE.

DELIMITER $$

CREATE PROCEDURE `hr`.`my_proc_CASE`

(INOUT no_employees INT, IN salary INT)

BEGIN

CASE

WHEN (salary>10000)

THEN (SELECT COUNT(job_id) INTO no_employees

FROM jobs

WHERE min_salary>10000);

WHEN (salary<10000)

THEN (SELECT COUNT(job_id) INTO no_employees

FROM jobs

WHERE min_salary<10000);

ELSE (SELECT COUNT(job_id) INTO no_employees

FROM jobs WHERE min_salary=10000);

END CASE;

END$$

В приведенной выше процедуре мы передаем переменную salary через параметр IN. Есть оператор CASE с двумя блоками WHEN и ELSE, который проверяет условия и возвращает значение счетчика в no_employees. no_employees — число сотрудников, в процедуру подается изначально пустое.

Выполним процедуру через командную строку MySQL.

Подсчитаем количество сотрудников, удовлетворяющих следующим условиям:

  • MIN_SALARY > 10000

  • MIN_SALARY < 10000

  • MIN_SALARY = 10000

Количество сотрудников, чья зарплата превышает 10000:

mysql> CALL my_proc_CASE(@C,10001);

Query OK, 1 row affected (0.00 sec)

mysql> SELECT @C;

+------+

| @C |

+------+

| 2 |

+------+

1 row in set (0.00 sec)

Количество сотрудников, чья зарплата меньше, чем 10000:

mysql> CALL my_proc_CASE(@C,9999);

Query OK, 1 row affected (0.00 sec)

mysql> SELECT @C;

+------+

| @C |

+------+

| 16 |

+------+

1 row in set (0.00 sec)

Количество сотрудников, чья зарплата равна 10000:

mysql> CALL my_proc_CASE(@C,10000);

Query OK, 1 row affected (0.00 sec)

mysql> SELECT @C;

+------+

| @C |

+------+

| 1 |

+------+

1 row in set (0.00 sec)