CASE
Оператор CASE
Оператор CASE дозволяє здійснити множинний вибір і має дві форми. Синтаксис першої форми оператора виглядає наступним чином:
CASE case_value
WHEN when_value THEN statement_list [WHEN when_value THEN statement_list] ... [ELSE statement_list] END CASE
Синтаксис другої форми:
CASE
WHEN search_condition THEN statement_list
[WHEN search_condition THEN statement_list] ...
[ELSE statement_list] END CASE
Зауваження:
- Синтаксис оператора case всередині збереженої процедури трохи відрізняється від синтаксису SQL-виразу CASE. Оператор CASE не може містити конструкціію ELSE NULL, і його виконання завершується за допомогою виразу END CASE, а не END.
У першій формі оператор case порівнює вираз case_value з when value. Як тільки відповідність знайдено, виконується відповідний оператор statement_list. Якщо ні однієї відповідності не знайдено, виконується оператор statement_list, розміщений після ключового слова else (якщо воно, звичайно, присутнє ). Перепишемо процедуру pricelist () з прикладу вище за допомогою оператора case (приклад нижче).
Приклад:
CREATE PROCEDURE pricelist (id INT, cur INT)
LANGUAGE SQL
BEGIN
CASE cur
WHEN 0 THEN
SELECT name, price FROM products WHERE id_catalog = id;
WHEN 1 THEN
SELECT name, price/8.8 FROM products WHERE id_catalog = id;
WHEN 2 THEN
SELECT name, price/14.5 FROM products WHERE id_catalog id;
WHEN 3 THEN
SELECT name, price/50.4 FROM products WHERE id_cat.alog = id;
ELSE
SELECT 'Ошибка в параметре cur';
END CASE;
END //
Ситуація, коли в якості параметра cur передано помилкове значення, оброблена спеціально в блоці ELSE. Підхід із застосуванням оператора if це також передбачає, але в операторі CASE ключове слово ELSE краще виділяється на фоні послідовності ключових слів when порівняно з ключовими словами ELSE IF в операторі IF.
Друга форма оператора CASE дозволяє здійснювати порівняння безпосередньо в конструкції WHEN - як тільки буде знайдено перше істинне значення, виконується оператор statement_list і процедура виходить з оператора CASE. У прикладі представлена ??процедура pricelist (), реалізована з використанням другої форми оператора CASE.
Приклад:
CREATE PROCEDURE pricelist (id INT, cur INT)
LANGUAGE SQL
BEGIN
CASE
WHEN cur = 0 THEN
SELECT name, price FROM products WHERE id_catalog = id;
WHEN cur = 1 THEN
SELECT name, price/8.8 from products where id_catalog = id;
WHEN cur = 2 THEN
SELECT name, price/14.5 FROM products WHERE id_catalog = id;
WHEN cur = 3 THEN
SELECT name, price/20.4 FROM products WHERE id_catalog = id;
ELSE
SELECT 'Ошибка в параметре cur';
END CASE;
END //
Якщо в одному блоці when необхідно виконати декілька запитів, слід використовувати блок begin ... end.