IF...THEN...ELSE

Оператор IF...THEN...ELSE

Оператор if дозволяє реалізувати розгалуження програми за умовою і має наступний синтаксис:

IF search_condition THEN statement_list

[ELSEIF search_condition THEN statement_list] ...

[ELSE statement_list] END IF

Логічний вираз search_condition може приймати два значення: 0 (брехня) і значення, відмінне від нуля (істина). Якщо логічний вираз істинний, то оператор statement_list після ключового слова виконується, інакше виконується список операторів у блоці else (якщо блок else є). Як statement_list може виступати складений оператор begin ... end.

Зауваження:

  • Слід зазначити, що в СКБД MySQL, крім оператора if, описаного тут, існує функція if ().

Розглянемо найпростіший приклад використання оператора if. Процедура pricelist (), представлена ??у прикладі нижче, виводить список товарних позицій в каталозі, первинний ключ яких дорівнює id. Другим параметром функції є число cur, що може приймати значення 0, якщо потрібно вивести ціни в рублях, і 1, якщо ціни повинні бути перераховані в долари з курсом 8.8 гривень.

Зауваження:

  • Для створення логічних виразів можна використовувати всі оператори порівняння ("=", ">", ">=" "<>", "<", "<="). Крім того, логічні вирази можна комбінувати між собою за допомогою операторів "&&" (І), а також "||" (АБО).

Приклад:

CREATE PROCEDURE pricelist (id INT, cur INT)

LANGUAGE SQL

BEGIN

IF(cur = 0) THEN

SELECT name, price FROM products WHERE id_cataiog = id;

end if;

IF(cur = 1) THEN

select name, price/8.8 FROM products WHERE id_catalog = id;

END IF

END //

CALL pricelist (1,1)//

name price/8.8

Celeron 1.8 55.381944

Celeron 2.0GHz 68.368056

Оператор if може бути оснащений додатковим блоком else, після якого виконуються оператори, якщо умова виявилася хибною. Функцію pricelist () можна переписати так, як це показано у прикладі.

Зауваження:

  • Після ключового слова ELSE ставити крапку з комою не потрібно, оскільки цим самим єдиний оператор IF розбивається на частини - крапку з комою ставлять після ключового слова END IF.

Приклад:

CREATE PROCEDURE pricelist (id INT, cur INT)

LANGUAGE SQL

BEGIN

IF(cur) then

SELECT name, price/8.8 FROM products WHERE id_catalog = id;

ELSE

SELECT name, price FROM products WHERE id_catalog = id;

END IF;

END //

З точки зору функціональності, збережені процедури з прикладів абсолютно однакові, але в останньому випадку знадобився лише один оператор IF, який приймає в якості логічного виразу параметр cur. Якщо cur дорівнює 1, що є істиною, виконується перший оператор, який виводить ціни в доларах, якщо параметр cur дорівнює 0, що є брехнею, виконується запит в блоці ELSE.

Оператор if дозволяє вибрати і більше альтернатив. Нехай необхідно крім гривневого і доларового прайс-листа, виводити ціни в євро за курсом 14.5 гривень за євро. Таким чином, параметр cur може приймати такі значення:

  • 0 - гривні;
  • 1-долари;
  • 2 і вище - євро.

Приклад:

CREATE PROCEDURE pricelist (id INT, cur INT)

LANGUAGE SQL -> BEGIN

IF(cur = 0) THEN

SELECT name, price FROM products WHERE id_catalog = id;

ELSEIF (cur = 1) THEN

SELECT name, price/8.8 FROM products WHERE id_catalog = id;

ELSE

SELECT name, price/14.5 FROM products WHERE id_catalog = id;

END IF;

END //

Оператор if в попередньому прикладі перевіряє, чи не рівний параметр cur нулю, якщо це так спрацьовує перший запит і процедура виходить з if. Якщо параметр cur не поранений нулю, перевірка переміщається до блоку elseif, де відбувається порівняння параметра cur з одиницею. Рівність cur одиниці призводить до виконання другого оператора select. Якщо оператор cur приймає будь-яке інше значення, відмінне від 0 і 1, виконується третій запит. Третій запит буде виконаний, навіть якщо cur є негативним значенням.

Кількість блоків else if не обмежена - можна використовувати будь-яке їх число. Додамо в процедуру pricelist () англійський фунт стерлінгів за курсом 20.4 гривні за фунт будемо використовувати значення параметра cur, що дорівнює 3 і вище, для позначення цієї валюти (приклад).

Приклад:

CREATE PROCEDURE pricelist (id INT, cur INT)

LANGUAGE SQL

BEGIN

IF(cur = 0) then

SELECT name, price FROM products WHERE id_catalog = id;

ELSEIF (cur = 1) THEN

SELECT name, price/8.8 FROM products WHERE id_catalcg = id;

ELSEIF (cur - 2) THEN

SЕLEСТ name, price/14.5 FROM products WHERE Id_catalog = id;

ELSE

SELECT name, price/20.4 FROM products WHERE id_catalog = id;

END IF;

END //

Проте зловживати блоками elseif не рекомендується, тому що велика кількість блоків else if знижує читабельність коду.

Якщо в блоках if, elseif і else використовується два або більше операторів, для наочності можна вдатися до складеного оператору begin ... end. У прикладі наводиться варіант процедури pricelist () з виводом прайс-листів, що містять ціни в рублях, доларах і євро. Однак для кожного списку буде виводитися загальне число товарних позицій та їх загальна вартість у вибраній валюті для каталогу з первинним ключем id.

Приклад:

CREATE PROCEDURE pricelist (id INT, cur INT)

LANGUAGE SQL

BEGIN

IF(cur = 0) THEN

BEGIN

SELECT name, price FROM products WHERE id_catalog = id;

SELECT SUM(count), SUM(price*count) FROM products

WHERE id_catalog = id;

END;

ELSEIF (cur = 1) THEN

BEGIN

SELECT name, price/8.8 FROM products WHERE id_catalog = id;

SELECT SUM(count), SUM(price*count)/8.8 FROM products

WHERE id_catalog = id;

END;

ELSE

BEGIN

SELECT name, price/14.5 FROM products WHERE id_catalog = id;

SELECT SUM(count), SUM(price*count)/14.5 FROM products

WHERE id_catalog = id;

END;

END IF;

END //