
CASE, COALESCE и даты: превратить хранимое в понятное
Строим вычисляемые столбцы, правильно обрабатываем NULL и задаём границы месяца. Разбираем, почему форматирование для экрана не должно становиться форматом хранения.
Зачем это нужно
База хранит устойчивые факты: тиыны, ISO-даты, ключи. Читателю нужны тенге, подписи и статус лимита. SQL может вычислить представление, не переписывая исходные данные.
Образ. Факт — продукт на складе, выражение
SELECT— сервировка. Красиво подать можно по-разному, но не нужно хранить продукт уже нарезанным для каждого блюда.
Сразу целиком
SELECT happened_on,
amount_tiyn / 100.0 AS amount_kzt,
COALESCE(note, 'Без заметки') AS note,
CASE
WHEN amount_tiyn >= 5000000 THEN 'крупная'
WHEN amount_tiyn >= 1000000 THEN 'средняя'
ELSE 'небольшая'
END AS size
FROM transactions;
Разбор
AS даёт результату понятное имя. Деление на 100.0, а не 100, явно требует дробный результат в SQLite. Для финансового расчёта исходное целое сохраняется; дробь здесь только для показа.
COALESCE(a, b, c) возвращает первое не-NULL значение. Это не превращает неизвестное в ноль навсегда — только выбирает подпись в результате.
CASE проверяет условия сверху вниз и останавливается на первом истинном. Взаимоисключающие границы нужно читать именно в этом порядке.
Месяц фильтруем границами. Функция date('2026-09-15', 'start of month', '+1 month') удобна в SQLite, но её синтаксис не переносим буквально в PostgreSQL. Переносимая идея — вычислить начало текущего и следующего периода один раз и передать как параметры.
Карта урока
Скажите своими словами
- Почему сумму форматируют при выводе, а не хранят строкой
3 200 ₸? - Что вернёт
COALESCE(NULL, 0)? - Почему порядок ветвей
CASEважен?
Задание
Покажите каждую операцию и поле has_note со значениями yes или no. Пустую строку считайте отсутствующей заметкой вместе с NULL.
Куда это встанет в проекте
Выражения подготовят понятные поля месячного отчёта, оставляя модель хранения строгой.
Ответы
Показать ответы
SELECT id,
CASE WHEN NULLIF(trim(note), '') IS NULL THEN 'no' ELSE 'yes' END AS has_note
FROM transactions;
Источники
Если вы нашли ошибку или опечатку в тексте статьи, то сообщите нам об этом
Комментарии (0)
Войдите, чтобы оставить комментарий →
Пока нет комментариев. Будьте первым.