Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АрхитектураБиологияГеографияДругоеИностранные языки
ИнформатикаИсторияКультураЛитератураМатематика
МедицинаМеханикаОбразованиеОхрана трудаПедагогика
ПолитикаПравоПрограммированиеПсихологияРелигия
СоциологияСпортСтроительствоФизикаФилософия
ФинансыХимияЭкологияЭкономикаЭлектроника

Выражение case

Подзапросы как генераторы выражений | Gt; SUM(a.avail_balance) tot_deposits _> FROM account a | Краткий обзор подзапросов | Упражнения | Внешние соединения | Сравнение левосторонних и правосторонних внешних соединений | Трехсторонние внешние соединения | Рекурсивные внешние соединения | Перекрестные соединения | Естественные соединения |


Читайте также:
  1. Ваше тело – это живое выражение вашей точки зрения на мир.
  2. Выражение
  3. Выражение insert
  4. Выражение конфликта
  5. Выражение принадлежности
  6. Выражение эмоций

 

Все основные серверы БД включают встроенные функции, имитирую_ щие выражение 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

mybiblioteka.su - 2015-2024 год. (0.007 сек.)