Выбор значений с помощью CASE
Иногда столбец должен говорить разное для разных строк: «дешёвая» для одних игр, «дорогая» для других. Для этого и нужен CASE. Он по очереди проверяет условия и возвращает значение первого из тех, что выполнились:
SELECT title, price,
CASE
WHEN price < 20 THEN 'дешёвая'
WHEN price < 40 THEN 'обычная'
ELSE 'дорогая'
END AS category
FROM games
LIMIT 4;| title | price | category |
|---|---|---|
| Dragon Forge | 40 | дорогая |
| Pixel Racer | 15 | дешёвая |
| Moon Farm | 20 | обычная |
| Castle Siege | 30 | обычная |
Читайте так: если цена меньше 20, то «дешёвая»; если меньше 40, то «обычная»; иначе (ELSE) — «дорогая». CASE начинает выбор, а END завершает его, и всё вместе — это одно значение, которому с помощью AS дают имя, как любому вычислению. Условия — те же, что вы знаете из WHERE, так что в них можно использовать AND, OR, IN, LIKE или IS NULL, а значениями могут быть тексты, числа или вычисления. Пишите каждый WHEN на отдельной строке, чтобы читать их как список.
Порядок WHEN важен. SQLite проверяет их сверху вниз и останавливается на первом выполнившемся. Moon Farm стоит $20: первое условие не выполняется, второе выполняется, поэтому игра «обычная», а остальное пропускается. Если бы вы поменяли первые две строки местами, так что WHEN price < 40 оказалось бы первым, то и Cube Logic за $5 стала бы «обычной»: 5 меньше 40, и SQLite никогда не дошёл бы до строки с «дешёвой». Поэтому, когда условия пересекаются, ставьте первым самое узкое.
Без ELSE строки, не подходящие ни под одно условие, получают NULL.
Когда все условия сравнивают один столбец со значением, есть форма покороче: столбец пишется сразу после CASE, а в каждом WHEN остаётся только значение:
SELECT id, status,
CASE status
WHEN 'paid' THEN 'OK'
WHEN 'refunded' THEN 'деньги возвращены'
END AS note
FROM orders
WHERE id BETWEEN 6 AND 8;| id | status | note |
|---|---|---|
| 6 | paid | OK |
| 7 | refunded | деньги возвращены |
| 8 | paid | OK |
Типичная ошибка: забытый END. Без него SQLite не знает, где заканчивается CASE, и останавливается на первом неожиданном слове: near "AS": syntax error. Если вы получили такую ошибку рядом с CASE, проверьте, есть ли у него END.
Задание
- 1
Родители хотят знать, какие игры для кого. Покажите название, возрастной рейтинг и
audience:взрослыедля игр с рейтингом 18,подросткидля игр с рейтингом 12 и выше идетидля остальных. Отсортируйте игры по возрастному рейтингу от самого высокого, а игры с одинаковым рейтингом — по названию:title age_rating audience Zombie Town 18 взрослые Dragon Forge 16 подростки Knight's Oath 16 подростки Robot Rebellion 16 подростки Shadow Ninja 16 подростки Castle Siege 12 подростки … … … - 2
Ниже покажите отзывы на игры 1 и 2:
game_id,customer_id, оценку в звёздах иverdict:положительныйдля 4 или 5 звёзд,нейтральныйдля 3 звёзд иотрицательныйдля меньшего числа. Отсортируйте отзывы поgame_id, а затем поcustomer_id:game_id customer_id stars verdict 1 1 4 положительный 1 2 5 положительный 1 5 3 нейтральный 1 8 5 положительный 2 5 4 положительный 2 6 2 отрицательный