SQL CASE WHEN
Операторы SQL CASE являются основой работы аналитических инженеров и проектов dbt. Они помогают добавить контекст к данным, делают поля более читаемыми или удобными для использования и позволяют создавать определенные категории в ваших данных.
Если неформально формализовать, операторы CASE в SQL эквивалентны конструкции if-then в других языках программирования. Они позволяют обрабатывать несколько сценариев (или случаев) в ваших данных, оценивать их на истинность и выводить соответствующее значение для каждого случая.
На этой странице мы разберем, как использовать операторы SQL CASE и продемонстрируем, почему они ценны для современных команд, работающих с данными.
Как использовать операторы SQL CASE
Операторы CASE WHEN создаются в операторах SELECT вместе с другими полями, которые вы выбираете. Общий синтаксис для операторов SQL CASE WHEN следующий:
case when [сценарий 1] then [результат 1]
when [сценарий 2] then [результат 2]
-- …сколько угодно сценариев
when [сценарий n] then [результат n]
else [результат по умолчанию] -- этот else является необязательным
end as <новое_имя_поля>
Некоторые замечания о функциональности операторов CASE:
- Сценарии в операторах CASE оцениваются в порядке их перечисления. Что это значит? Это значит, что если несколько сценариев оцениваются как истинные, то результат возвращается для самого раннего из них.
- Результаты в каждом сценарии должны быть одного и того же типа данных; если сценарий 1 приводит к строке, все остальные сценарии также должны быть строками.
- Часто команды, работающие с данными, опускают финальный
elseсценарий, так какelse [результат по умолчанию]является необязательным и по умолчанию равенelse null. - В общем, производительность операторов CASE в операторах select относительно эффективна (по сравнению с другими функциями SQL, такими как агрегаты или сложные соединения с использованием AND и OR); это не значит, что сравнение большого количества сценариев эффективно (или разумно), но это, вероятно, не станет узким местом в ваших моделях данных.
- Результаты операторов CASE WHEN также могут быть переданы в агрегатные функции, такие как MAX, MIN и COUNT, или даже в функции работы с датами (например,
date_trunc('month', <case when statement>).
Давайте рассмотрим практический пример использования оператора CASE.
Пример SQL CASE WHEN
select
order_id,
round(amount) as amount,
case when amount between 0 and 10 then 'low'
when amount between 11 and 20 then 'medium'
else 'high'
end as order_value_bucket
from {{ ref('orders') }}
Этот простой запрос, использующий таблицу orders из Jaffle Shop, вернет новое поле, которое распределяет сумму заказа по критериям:
| Loading table... |
Синтаксис SQL CASE WHEN в Snowflake, Databricks, BigQuery и Redshift
Поскольку это основа SQL, большинство, если не все, современные хранилища данных поддерживают возможность добавления операторов CASE WHEN в свои запросы. Snowflake, Databricks, Google BigQuery и Amazon Redshift поддерживают операторы CASE и имеют одинаковый синтаксис для них.
Примеры использования CASE WHEN
Примеры использования операторов CASE в моделях dbt и временных запросах практически бесконечны; в результате мы не будем (и не сможем) создавать исчерпывающий список мест, где вы можете встретить операторы CASE.
Вместо этого важно понимать, почему вы хотите использовать их в своей работе с данными и в каких случаях использовать их не стоит. Вот несколько примеров, зачем может понадобиться использовать case‑выражения:
- Создание булевых значений на основе существующих данных (например,
case when cnt > 1 then true else false end as is_active) - Определение маппингов между сырыми данными и более обобщёнными категориями данных (см. пример выше на странице); обратите внимание: если вы создаёте много сценариев
case whenдля маппинга, который не меняется со временем, скорее всего, лучше вынести этот маппинг либо в отдельную модель dbt, либо в источник данных (хороший вариант использования seeds) - Если вы обнаружите, что используете одно и то же выражение
case whenво многих моделях, стоит рассмотреть возможность вынести его в отдельную модель или в DRY macro - Генерация более понятных для бизнес‑пользователей значений колонок, которые легко интерпретировать и использовать