На главную страницу
Об использовании оператора CASE
Моисеенко С.И.
В справке на сайте описан синтаксис
этого оператора и приведены примеры его использования. Однако эти примеры демонстрируют
применение CASE в предложении SELECT. Действительно, это место наиболее частого
использования оператора, однако не единственное. Мы можем использовать CASE практически
везде, и здесь я покажу несколько примеров его применения в других предложениях
оператора SELECT.
Предложение WHERE
Предложение WHERE ограничивает выходной набор теми строками, которые удовлетворяют
предикату в этом предложении. Предположим, что у нас имеется такое соответствие
между объемом памяти ПК и типом используемой операционной системы (естественно,
условно):
RAM < 64 W95
RAM >=64 и < 128 W98
RAM >= 128 W2k
Если мы захотим отобрать компьютеры по типу ОС (заметим, что такого поля нет в таблице
PC), то можно написать следующий оператор:
SELECT * FROM pc
WHERE CASE WHEN ram <64 THEN 'W95'
WHEN ram <128 THEN 'W98'
ELSE 'W2k' END
='W98'
Здесь мы выбираем модели, подходящие для операционной системы W98. Ниже приведен
результат выполнения этого запроса.
code |
model
|
speed
|
ram |
hd |
cd |
price |
1 |
1232 |
500 |
64 |
5 |
12x |
600.0 |
3 |
1233 |
500 |
64 |
5 |
12x |
600.0 |
8 |
1232 |
450 |
64 |
8 |
24x |
350.0 |
Это может оказаться более полезным, чем кажется на первый взгляд, если иметь в виду
конфиденциальность информации. Например, на клиенте можно формировать запросы, которые
будут оперировать такими категориями, как высоко, средне и низко оплачиваемый специалист.
Т.е. сами критерии (оклады) будут спрятаны, скажем, в хранимой процедуре, а через
параметр будет передаваться что-то типа символьной строки "средний".
Предложение GROUP BY
Пусть теперь мы хотим получить количество компьютеров, подходящих по RAM к каждому
типу операционных систем. Тогда мы можем написать такой запрос:
SELECT
CASE WHEN ram <64 THEN 'W95'
WHEN ram <128 THEN 'W98'
ELSE 'W2k' END Type,
COUNT(*) Qty FROM pc
GROUP BY
CASE WHEN ram <64 THEN 'W95'
WHEN ram <128 THEN 'W98'
ELSE 'W2k' END
В результате выполнения запроса получим
Type |
Qty
|
W2k |
5 |
W95 |
3 |
W98 |
3 |
Здесь мы дублируем оператор CASE в предложении SELECT, чтобы получить столбец с
наименованием ОС.
Предложение ORDER BY
Использование оператора CASE в предложении ORDER BY позволяет выполнить более сложную
сортировку, чем та, которая допускается при использовании сортировки по набору столбцов.
Если мы будем выполнять сортировку по столбцу RAM, то у нас есть две возможности
- по возрастанию или по убыванию. Если же мы хотим вывести сначала средние модели,
т.е. те, которые отвечают W98, потом высшие (W2k), а уже потом низшие (W95), то
можно поступить так
SELECT * FROM pc
ORDER BY
CASE WHEN ram <64 THEN '3-W95'
WHEN ram <128 THEN '1-W98'
ELSE '2-W2k' END
Цифры перед названием ОС проставлены в соответствии с желательным порядком сортировки.
В противном случае, упорядочение текстовых значений по возрастанию будет следующим:
W2k, W95, W98. Вот результат вышеприведенного запроса (столбец сортировки выделен
цветом):
code |
model
|
speed
|
ram |
hd |
cd |
price |
3 |
1233 |
500 |
64 |
5 |
12x |
600.0 |
1 |
1232 |
500 |
64 |
5 |
12x |
600.0 |
8 |
1232 |
450 |
64 |
8 |
24x |
350.0 |
2 |
1121 |
750 |
128 |
14 |
40x |
850.0 |
4 |
1121 |
600 |
128 |
14 |
40x |
850.0 |
5 |
1121 |
600 |
128 |
8 |
40x |
850.0 |
6 |
1233 |
750 |
128 |
20 |
50x |
950.0 |
11 |
1233 |
900 |
128 |
40 |
40x |
980.0 |
7 |
1232 |
500 |
32 |
10 |
12x |
400.0 |
9 |
1232 |
450 |
32 |
10 |
24x |
350.0 |
10 |
1260 |
500 |
32 |
10 |
12x |
350.0 |
Есть еще более интересная возможность сортировки, а именно, сортировать по разным
столбцам в зависимости от значения в некотором поле. Пусть, например, в группе W95
мы хотим выполнить сортировку по столбцу speed, в группе W98 - по столбцу hd, в
группе W2k - по столбцу price. Т.е. нам нужно в каждой группе, характеризуемой ОС
(описанными выше критериями), выполнить сортировку по разным полям. Эту, на первый
взгляд непростую задачу, решает простой запрос с оператором CASE в предложении ORDER
BY:
SELECT * FROM pc
ORDER BY
ram, CASE WHEN ram <64 THEN speed
WHEN ram <128 THEN hd
ELSE price END
В нижеприведенном результате поля сортировки каждой группы выделены разными цветами.
code |
model
|
speed
|
ram |
hd |
cd |
price |
9 |
1232 |
450 |
32 |
10 |
24x |
350.0 |
10 |
1260 |
500 |
32 |
10 |
12x |
350.0 |
7 |
1232 |
500 |
32 |
10 |
12x |
400.0 |
1 |
1232 |
500 |
64 |
5 |
12x |
600.0 |
3 |
1233 |
500 |
64 |
5 |
12x |
600.0 |
8 |
1232 |
450 |
64 |
8 |
24x |
350.0 |
2 |
1121 |
750 |
128 |
14 |
40x |
850.0 |
4 |
1121 |
600 |
128 |
14 |
40x |
850.0 |
5 |
1121 |
600 |
128 |
8 |
40x |
850.0 |
6 |
1233 |
750 |
128 |
20 |
50x |
950.0 |
11 |
1233 |
900 |
128 |
40 |
40x |
980.0 |
Приведенные здесь примеры можно выполнить непосредственно на сайте, установив флажок
"Без проверки" на странице с упражнениями
на SELECT.
На главную страницу