Shanraq.org Shanraq.org
CASE, COALESCE и даты: превратить хранимое в понятное
IT

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. Переносимая идея — вычислить начало текущего и следующего периода один раз и передать как параметры.

Карта урока

Выражения не меняют исходный факт

Скажите своими словами

  1. Почему сумму форматируют при выводе, а не хранят строкой 3 200 ₸?
  2. Что вернёт COALESCE(NULL, 0)?
  3. Почему порядок ветвей 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;

Источники

Если вы нашли ошибку или опечатку в тексте статьи, то сообщите нам об этом

Проверить задание

Сначала решите и запустите в VS Code — редактор покажет ошибку на месте. Готовое решение вставьте сюда. Проверяет модель: она укажет на ошибку, но не даст готовый ответ.

Чтобы проверить, нужно войти. Войти

Комментарии (0)

Пока нет комментариев. Будьте первым.