Предложение ORDER BY
Использование оператора CASE в предложении ORDER BY позволяет выполнить более сложную сортировку, чем та, которая допускается при использовании сортировки по набору столбцов. При сортировке по столбцу ram можно выполнить ее по возрастанию или по убыванию. Если же мы хотим вывести сначала средние модели, то есть те, которые отвечают W98, потом высшие (W2k), а уже потом низшие (W95), то можно поступить так:
SELECT *
FROM PC
ORDER BY CASE
WHEN ram <= 32
THEN '3-W95'
WHEN ram <= 64
THEN '1-W98'
ELSE '2-W2k'
END;
[[ column ]] |
---|
[[ value ]] |
Цифры перед названием ОС проставлены в соответствии с желательным порядком сортировки. В противном случае, упорядочение текстовых значений по возрастанию будет следующим: W2k, W95, W98. Вот результат вышеприведенного запроса (заголовок столбца сортировки выделен прописными буквами):
code | model | speed | RAM | hd | cd | price |
---|---|---|---|---|---|---|
3 | 1233 | 500 | 64 | 5 | 12x | 600 |
1 | 1232 | 500 | 64 | 5 | 12x | 600 |
8 | 1232 | 450 | 64 | 8 | 24x | 350 |
2 | 1121 | 750 | 128 | 14 | 40x | 850 |
4 | 1121 | 600 | 128 | 14 | 40x | 850 |
5 | 1121 | 600 | 128 | 8 | 40x | 850 |
6 | 1233 | 750 | 128 | 20 | 50x | 950 |
11 | 1233 | 900 | 128 | 40 | 40x | 980 |
12 | 1233 | 800 | 128 | 20 | 50x | 970 |
7 | 1232 | 500 | 32 | 10 | 12x | 400 |
9 | 1232 | 450 | 32 | 10 | 24x | 350 |
10 | 1260 | 500 | 32 | 10 | 12x | 350 |
Есть еще более интересная возможность сортировки, а именно, сортировать по разным столбцам в зависимости от значения в некотором поле. Пусть, например, в группе W95 мы хотим выполнить сортировку по столбцу speed, в группе W98 — по столбцу hd, в группе W2k — по столбцу price. То есть в каждой группе, характеризуемой ОС описанными выше критериями, нам нужно выполнить сортировку по разным столбцам. Эту, на первый взгляд непростую задачу, решает простой запрос с оператором CASE в предложении ORDER BY:
SELECT *
FROM PC
ORDER BY ram,
CASE
WHEN ram <= 32
THEN speed
WHEN ram <= 64
THEN hd
ELSE price
END;
[[ column ]] |
---|
[[ value ]] |
Вот результат этого запроса:
code | model | speed | ram | hd | cd | price |
---|---|---|---|---|---|---|
9 | 1232 | 450 | 32 | 10 | 24x | 350 |
10 | 1260 | 500 | 32 | 10 | 12x | 350 |
7 | 1232 | 500 | 32 | 10 | 12x | 400 |
1 | 1232 | 500 | 64 | 5 | 12x | 600 |
3 | 1233 | 500 | 64 | 5 | 12x | 600 |
8 | 1232 | 450 | 64 | 8 | 24x | 350 |
2 | 1121 | 750 | 128 | 14 | 40x | 850 |
4 | 1121 | 600 | 128 | 14 | 40x | 850 |
5 | 1121 | 600 | 128 | 8 | 40x | 850 |
6 | 1233 | 750 | 128 | 20 | 50x | 950 |
12 | 1233 | 800 | 128 | 20 | 50x | 970 |
11 | 1233 | 900 | 128 | 40 | 40x | 980 |
Рекомендуемые упражнения: 65