Что такое условная логика?
217
|
6
|
666666666
|
I
|
John Spencer
|
NULL
|
|
7
|
777777777
|
I
|
Margaret Young
|
NULL
|
|
8
|
888888888
|
I
|
Louis Blake
|
NULL
|
|
9
|
999999999
|
I
|
Richard Farley
|
NULL
|
|
10
|
041111111
|
B
|
NULL
|
Chilton
Engineering
|
|
11
|
042222222
|
B
|
NULL
|
Northeast Cooling Inc.
|
|
12
|
043333333
|
B
|
NULL
|
Superior Auto Body
|
|
13
|
044444444
|
B
|
NULL
|
AAA Insurance Inc.
|
++++++
13 rows in set (0.13 sec)
Вызывающий может взглянуть на значение столбца
cust_type_cd
и вы
брать, какой столбец использовать –
indiv_name
или
business_name
. Од
нако вместо этого можно было бы применить условную логику, вос
пользовавшись
выражением case
, чтобы определить тип клиента и воз
вратить соответствующую строку.
mysql>
SELECT c.cust_id, c.fed_id,
> CASE
> WHEN c.cust_type_cd = 'I'
> THEN CONCAT(i.fname, ' ', i.lname)
> WHEN c.cust_type_cd = 'B'
> THEN b.name
> ELSE 'Unknown'
> END name
> FROM customer c LEFT OUTER JOIN individual i
> ON c.cust_id = i.cust_id
> LEFT OUTER JOIN business b
> ON c.cust_id = b.cust_id;
++++
| cust_id | fed_id | name |
++++
| 1 | 111111111 | James Hadley |
| 2 | 222222222 | Susan Tingley |
| 3 | 333333333 | Frank Tucker |
| 4 | 444444444 | John Hayward |
| 5 | 555555555 | Charles Frasier |
| 6 | 666666666 | John Spencer |
| 7 | 777777777 | Margaret Young |
| 8 | 888888888 | Louis Blake |
| 9 | 999999999 | Richard Farley |
| 10 | 041111111 | Chilton Engineering |
| 11 | 042222222 | Northeast Cooling Inc. |
| 12 | 043333333 | Superior Auto Body |
| 13 | 044444444 | AAA Insurance Inc. |
++++
13 rows in set (0.00 sec)
Эта версия запроса возвращает один столбец
name
. Он
формируется
выра
жением
case
, начинающимся во второй строке запроса
, которое в дан
218
Глава 11. Условная логика
ном случае проверяет значение столбца
cust_type_cd
и возвращает имя/
фамилию физического лица
или
название фирмы.
Выражение case
Все основные серверы БД включают встроенные функции, имитирую
щие выражение ifthenelse, которое есть в
большинстве языков про
граммирования (например, функция
decode()
Oracle, функция
if()
MySQL и функция
coalesce()
SQL Server). Выражения
case
тоже разра
ботаны для поддержки логики ifthenelse, но в сравнении со встроен
ными функциями обладают двумя преимуществами:
•
Выражение
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
219
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 'NonTeller'
END
Это выражение
case
возвращает строку, с
помощью которой можно оп
ределять расценки почасовой оплаты, печатать бейджи с именами и т. д.
При вычислении выражения
case
блоки
when
обрабатываются сверху
вниз. Как только одно из условий блока
when
принимает значение
true
,
возвращается соответствующее выражение, а все остальные блоки
when
игнорируются. Если ни одно из условий блока
when
не выполняется,
возвращается выражение блока
else
.
Хотя предыдущий пример возвращает строковые выражения, помни
те, что выражения case могут возвращать выражения любого типа,
включая подзапросы. Вот еще одна версия приведенного ранее в этой
главе запроса имени физического лица/названия фирмы, в которой
для извлечения данных из таблиц
individual
и
business
вместо внеш
них соединений используются подзапросы:
mysql>
Достарыңызбен бөлісу: