Иллюстрированный самоучитель по SQL для начинающих

Сложные выражения со значением

Использование выражения CASE со значениями

При сравнении проверяемого значения с набором других можно использовать более компактную форму выражения CASE. Эту форму полезно использовать внутри оператора SELECT или UPDATE, когда в столбце таблицы содержится ограниченное число разных значений и нужно связать с каждым из них соответствующее значение результата CASE. Если использовать выражение CASE таким образом, то оно будет иметь следующий синтаксис:

CASE значение_n
WHEN значенив1 THEN результат1
WHEN значение2 THEN результат2
…
WHEN значение_n THEN результат_n
ELSE результат_х
END

Если проверяемое значение (значение_n) равно значению1, то выражение принимает значение результат1. А если значение_n не равно значению1, а значению2, то выражение принимает значение результат2. Все значения, предназначенные для сравнения, проверяются сверху вниз, по направлению к значению_n, пока не будет найдено то из них, которое равно значению_n. Если же такое значение найдено не будет, то выражение принимает значение результат_х. И опять, если необязательное предложение ELSE отсутствует и ни одно из значений, предназначенных для сравнения, не равно проверяемому, то выражение принимает неопределенное значение.

Чтобы понять, как работает форма CASE со значениями, проанализируйте пример с таблицей, в которой находятся фамилии и звания офицеров. Требуется получить их список, в котором перед фамилиями офицеров стояли бы аббревиатуры их званий. Для сравнения будут использоваться такие звания: генерал (general), полковник (colonel), подполковник (lieutenant colonel), майор (major), капитан (captain), старший лейтенант (first lieutenant), лейтенант (second lieutenant). И наконец, тот, у кого какое-либо другое звание, в списке будет просто назван "господином" (Mr.). Список создается с помощью следующего оператора:

SELECT CASE RANK
WHEN ' general' THEN 'Gen.'
WHEN 'colonel' THEN 'Col.'
WHEN 'lieutenant colonel' THEN 'Lt. Col.
WHEN 'major' THEN 'Maj.'
WHEN ' captain' THEN 'Capt. '
WHEN 'first lieutenant' THEN '1st. Lt.
WHEN 'second lieutenant' THEN '2nd. Lt.
ELSE 'Mr. '
END,
LAST_ NAME
FROM OFFICERS;
Результат должен быть примерно такой:
Capt. Midnight
Col. Sanders
Gen. Schwarzkopf
Maj. Disaster
Mr. Nimitz

Честер Нимиц был адмиралом во флоте Соединенных Штатов во время Второй мировой войны. Так как в выражении CASE его звания нет, то оно определяется предложением ELSE.

Вот еще пример. Предположим, что капитан Миднайт получает повышение в звании и становится майором. Требуется сделать соответствующие изменения в базе данных OFFICERS (офицеры). Предположим, что в переменной officerjastjiame (фамилия офицера) находится значение 'Midnight', а в переменной new_rank (новое звание) – целое значение (4), которое, согласно следующей таблице, соответствует новому званию Миднайта.

Тогда ввести данные о повышении можно с помощью следующего кода SQL:

UPDATE OFFICERS
SET RANK = CASE:new_rank
WHEN 1 THEN 'general'
WHEN 2 THEN 'colonel'
WHEN 3 THEN ' lieutenant colonel'
WHEN 4 THEN 'major'
WHEN 5 THEN 'captain'
WHEN 6 THEN 'first lieutenant'
WHEN 7 THEN 'second lieutenant'
WHEN 8 THEN'Mr. '
END
WHERE LAST_NAME =:officer_last_name;
new_rank Звание
1 general
2 colonel
3 lieutenant colonel
4 major
5 captain
6 first lieutenant
7 second lieutenant
8 Mr.

Для выражения CASE со значениями есть еще один синтаксис:

CASE
WHEN значение_n = значение1 THEN результат1
WHEN значвние_n = значение2 THEN результат2
…
WHEN значение_n = значвние_n THEN результат_n
ELSE результат_х
END
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.