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.