Читайте также: |
|
Все основные серверы БД включают встроенные функции, имитирую_ щие выражение if_then_else, которое есть в большинстве языков про_ граммирования (например, функция decode() Oracle, функция if() MySQL и функция coalesce() SQL Server). Выражения case тоже разра_ ботаны для поддержки логики if_then_else, но в сравнении со встроен_ ными функциями обладают двумя преимуществами:
• Выражение case является частью стандарта SQL (версия SQL92) и реализовано в Oracle Database, SQL Server и MySQL.
• Выражения case встроены в грамматику SQL и могут быть включе_ ны в выражения select, insert, update и delete.
В следующих двух разделах представлены выражения case двух раз_ ных типов, а затем я привожу несколько примеров выражений case в действии.
Выражения case с перебором вариантов
Приведенное ранее в этой главе выражение case – пример выражения case с перебором вариантов (searched case expression), имеющего сле_дующий синтаксис:
CASE
WHEN C1 THEN E1 WHEN C2 THEN E2
...
WHEN CN THEN EN [ELSE ED]
END
В этом описании символами C1, C2, …, CN обозначены условия, а символа_ ми E1, E2, …, EN – выражения, которые должны быть возвращены выра_ жением case. Если условие в блоке when выполняется, выражение case возвращает соответствующее выражение. Кроме того, символ ED пред_ ставляет применяемое по умолчанию выражение, возвращаемое выра_ жением case, если не выполнено ни одно из условий C1, C2, …, CN (блок else является необязательным, поэтому он заключен в квадратные скоб_ ки). Все выражения, возвращаемые различными блоками when, должны обеспечивать результаты одного типа (например, date, number, varchar).
Вот пример выражения case с перебором вариантов:
CASE
WHEN employee.title = 'Head Teller'
THEN 'Head Teller'
WHEN employee.title = 'Teller'
Выражение case | |
AND YEAR(employee.start_date) > 2004
THEN 'Teller Trainee'
WHEN employee.title = 'Teller'
AND YEAR(employee.start_date) < 2003
THEN 'Experienced Teller'
WHEN employee.title = 'Teller'
THEN 'Teller'
ELSE 'Non_Teller'
END
Это выражение case возвращает строку, с помощью которой можно оп_ ределять расценки почасовой оплаты, печатать бейджи с именами и т. д. При вычислении выражения case блоки when обрабатываются сверху вниз. Как только одно из условий блока when принимает значение true, возвращается соответствующее выражение, а все остальные блоки when игнорируются. Если ни одно из условий блока when не выполняется, возвращается выражение блока else.
Хотя предыдущий пример возвращает строковые выражения, помни_ те, что выражения case могут возвращать выражения любого типа, включая подзапросы. Вот еще одна версия приведенного ранее в этой главе запроса имени физического лица/названия фирмы, в которой для извлечения данных из таблиц individual и business вместо внеш_ них соединений используются подзапросы:
mysql> | SELECT c.cust_id, c.fed_id, |
_> | CASE |
_> | WHEN c.cust_type_cd = 'I' THEN |
_> | (SELECT CONCAT(i.fname, ' ', i.lname) |
_> | FROM individual i |
_> | WHERE i.cust_id = c.cust_id) |
_> | WHEN c.cust_type_cd = 'B' THEN |
_> | (SELECT b.name |
_> | FROM business b |
_> | WHERE b.cust_id = c.cust_id) |
_> | ELSE 'Unknown' |
_> | END name |
_> | FROM customer c; |
+_________+_____________+________________________+ | cust_id | fed_id | name | +_________+_____________+________________________+
| | | | 111_11_1111 | | James Hadley | | | |
| | | | 222_22_2222 | | Susan Tingley | | | |
| | | | 333_33_3333 | | Frank Tucker | | | |
| | | | 444_44_4444 | | John Hayward | | | |
| | | | 555_55_5555 | | Charles Frasier | | | |
| | | | 666_66_6666 | | John Spencer | | | |
| | | | 777_77_7777 | | Margaret Young | | | |
| | | | 888_88_8888 | | Louis Blake | | | |
| | | | 999_99_9999 | | Richard Farley | | | |
| | | | 04_1111111 | | Chilton Engineering | | |
220 Глава 11. Условная логика
| 11 | 04_2222222 | Northeast Cooling Inc. |
| | | | 04_3333333 | | | Superior Auto | Body | | | |
| | | | 04_4444444 | | | AAA Insurance | Inc. | | |
+_________+_____________+________________________+ 13 rows in set (0.01 sec)
В этом варианте запроса в блок from включена только таблица customer
и соответствующее имя для каждого клиента получается с помощью связанного подзапроса. Эта версия мне нравится больше той, где при_ меняются внешние соединения, поскольку здесь сервер считывает данные таблицы individual и business только в случае необходимости, а не соединяет все три таблицы.
Дата добавления: 2015-08-17; просмотров: 62 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Что такое условная логика? | | | Простые выражения case |