Книги и статьи по SQL Rambler's Top100 Switch language to: English 14 июля 2020 г. 19:14:24


www.sql-ex.ru
Skip Navigation Links  

 

Print  Версия для печати

На главную страницу

Об использовании оператора 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.

На главную страницу

Print  Версия для печати


Использование любых материалов данного сайта возможно только
при условии обязательного размещения прямой ссылки на сайт
http://www.sqlbooks.ru
на каждой странице, где размещены используемые материалы.

 Начало   Статьи    Книги 
Рейтинг@Mail.ru Rambler's Top100 Alt Упражнения по SQL: обучение, тестирование, сертификация по языку SQL Copyright c 2002-2006. All rights reserved.