Конструкции IF, CASE-WHEN онлайн урок.


В SQL существуют несколько операторов управления потоком команд, аналогично остальным языкам программирования. В этом уроке мы рассмотрим операторы IF и CASE.

Оператор IF - это аналог тернарного оператора PHP:

IF (логическое выражение, значение-1, значение-2) вернет:



  • значение-1, если логическое выражение - истина,

  • иначе - будет возвращено значение-2.


Например,

SELECT IF (0 > 2, 'yes', 'nope') AS testing;
+---------+
| testing |
+---------+
| nope |
+---------+
1 row in set (0.00 sec)

Для более содержательного примера, запишем запишем запрос, который содержит IF и подзапрос. Мы выведем таблицу group, немного изменив данные в результате:

SELECT 
name,
IF (description = 'Mathematics' OR description = 'Physics', 'MathPhys stuff', 'Bio stuff') AS stuff
FROM `group`;

+-----------+----------------+
| name | stuff |
+-----------+----------------+
| ifka-33-M | MathPhys stuff |
| satr-41-P | MathPhys stuff |
| oskt-56-B | Bio stuff |
+-----------+----------------+
3 rows in set (0.00 sec)

Как видим, мы получили строку 'MathPhys stuff' в случае математики или физики, и строку 'Bio stuff' в противном случае.

Оператор CASE - это аналог оператора switch в PHP. Его конструкция выглядит следующим образом:

CASE val
WHEN compare-1 THEN result-1
[ WHEN compare-2 THEN result-2

...
WHEN compare-N THEN result-N
ELSE default-result ]
END;

Эта конструкция сопоставляет значению val значения result-1 ... result-N. При первом совпадении конструкция возвращает соответствующий result-1 ... result-N. Если совпадений не найдено, то возвращается default-result. Часть конструкции, которая заключена в скобки является необязательной. Рассмотрим простой пример

SELECT name,
CASE age
WHEN 20 THEN 'is twenty'
WHEN 21 THEN 'is tweny one'
WHEN 22 THEN 'is twenty two'
ELSE 'is older than 22'
END

AS age_test
FROM student
ORDER BY age;

+---------+------------------+
| name | age_test |
+---------+------------------+
| Andy | is twenty |
| Debra | is tweny one |
| Mike | is older than 22 |
| Stanley | is older than 22 |
| Andy | is older than 22 |
| Mike | is older than 22 |
| Jeff | is older than 22 |
| John | is older than 22 |
+---------+------------------+
8 rows in set (0.00 sec)