Изучаем sql


SELECT c.cust_id, c.fed_id, c.cust_type_cd



Pdf көрінісі
бет193/261
Дата28.07.2022
өлшемі1,6 Mb.
#147825
1   ...   189   190   191   192   193   194   195   196   ...   261
Байланысты:
Изучаем SQL ( PDFDrive )

SELECT c.cust_id, c.fed_id, c.cust_type_cd,
> CONCAT(i.fname, ' ', i.lname) indiv_name,
> b.name business_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
|
cust_type_cd
|
indiv_name
|
business_name
|
++++++
|
1
|
111111111
|
I
|
James Hadley
|
NULL
|
|
2
|
222222222
|
I
|
Susan Tingley
|
NULL
|
|
3
|
333333333
|
I
|
Frank Tucker
|
NULL
|
|
4
|
444444444
|
I
|
John Hayward
|
NULL
|
|
5
|
555555555
|
I
|
Charles Frasier
|
NULL
|


Что такое условная логика?
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> 


Достарыңызбен бөлісу:
1   ...   189   190   191   192   193   194   195   196   ...   261




©engime.org 2024
әкімшілігінің қараңыз

    Басты бет