Замена NULL с помощью COALESCE
Вы знаете, что NULL означает отсутствие значения. Из этого следует вещь, о которой легко забыть: вычисление с NULL даёт NULL. Пять плюс что-то неизвестное — неизвестно, и текст, соединённый с пустотой, тоже. В этом списке клиентов это проблема, ведь город Ava Green — NULL:
SELECT name, 'Город: ' || city AS info
FROM customers
WHERE id BETWEEN 4 AND 6;| name | info |
|---|---|
| Noah Wilson | Город: Leeds |
| Ava Green | NULL |
| Jack Harris | Город: Manchester |
Пропал не только город, а весь текст: info у Ava Green — NULL. То же самое происходит с +, -, * и /, и большинство функций возвращают NULL для NULL, как вы видели на примере LENGTH.
Исправляет это функция COALESCE. Она принимает любое количество аргументов и возвращает первый из них, который не NULL. Так что COALESCE(city, 'неизвестен') — это город, если он у клиента есть, и текст 'неизвестен', если нет:
SELECT name, 'Город: ' || COALESCE(city, 'неизвестен') AS info
FROM customers
WHERE id BETWEEN 4 AND 6;| name | info |
|---|---|
| Noah Wilson | Город: Leeds |
| Ava Green | Город: неизвестен |
| Jack Harris | Город: Manchester |
С большим числом аргументов COALESCE пробует их по очереди: COALESCE(a, b, 'нет') — это a, если у a есть значение, иначе b, если оно есть у b, а иначе 'нет'.
В SQLite есть и IFNULL(x, y), которая делает то же самое ровно с двумя аргументами. COALESCE входит в стандарт SQL и работает в любой базе данных, поэтому в этом курсе используется она. То же можно записать и так: CASE WHEN city IS NULL THEN … ELSE city END, но COALESCE гораздо короче.
Заменяйте NULL только в том, что показывает запрос. В таблице NULL говорит правду: магазин не знает город, а выдуманное значение скрыло бы это. И следите, чтобы замена имела смысл: отсутствующее число — не всегда 0.
Типичная ошибка: текст для замены без кавычек. COALESCE(city, unknown) ищет столбец с названием unknown и завершается ошибкой no such column: unknown. Текст всегда пишется в одинарных кавычках: COALESCE(city, 'unknown').
Задание
- 1
Покажите название каждой игры и дату её выхода как
release_date, а для игр, которые ещё не вышли, —скоро выйдет. Отсортируйте игры по столбцуreleased, а затем по названию, чтобы невышедшие шли первыми:title release_date Mystery Manor скоро выйдет Robot Rebellion скоро выйдет Cube Logic 2020-02-11 … … - 2
Ниже покажите каждый отзыв на Dragon Forge (
game_idравен 1) одной строкой текста,summary: оценка в звёздах,/5:и комментарий, например4/5: Great story, a bit long.Для отзыва без комментария вместо него напишите(без комментария). Отсортируйте отзывы поcustomer_id:summary 4/5: Great story, a bit long. 5/5: Best RPG I have played in years! 3/5: Too hard at the start. 5/5: (без комментария)