@moonzzz

Как правильно записать CASE, чтобы если не подходит под условие выполнения функции дальше не выполнялось?

Выводятся еще дополнительно данные которые вообще не подходят под выборку.

SELECT id,
CASE
WHEN price > 10000 AND price < 11000 THEN 'Economy'
WHEN price >= 20000 AND price <= 30000 THEN 'PremiumEconomy'
WHEN price > 100000 THEN 'Business'

END as service_class, price
FROM tickets
  • Вопрос задан
  • 71 просмотр
Решения вопроса 1
@alexalexes
Если нужно ограничить выборку по вычисляемой колонке case, а разбирать смысл ее лень (или вы в процессе отладки это делаете), то нужно взять этот кейс, перетащить в where и проверить на is not null. Все, что в условия кейса попадает - будет строковым значением (нужно глазками посмотреть, чтобы в кейсе не было исходов с null), а все что не попадает в его условия - обратится в null (если явно не прописан else).
SELECT id,
CASE
  WHEN price > 10000 AND price < 11000 THEN 'Economy'
  WHEN price >= 20000 AND price <= 30000 THEN 'PremiumEconomy'
  WHEN price > 100000 THEN 'Business'
END as service_class, price
FROM tickets
where CASE
  WHEN price > 10000 AND price < 11000 THEN 'Economy'
  WHEN price >= 20000 AND price <= 30000 THEN 'PremiumEconomy'
  WHEN price > 100000 THEN 'Business'
END is not null

А если делать по уму, конечно, кейс оставлять в where - это крайняя мера. Его быть не должно, это ухудшит показатели плана выполнения запроса (не всегда). Нужно вытаскивать булеву конструкцию, желательно, логически упрощенную.
SELECT id,
CASE
  WHEN price > 10000 AND price < 11000 THEN 'Economy'
  WHEN price >= 20000 AND price <= 30000 THEN 'PremiumEconomy'
  WHEN price > 100000 THEN 'Business'
END as service_class, price
FROM tickets
where (price > 10000 AND price < 11000) --  'Economy'
   or (price >= 20000 AND price <= 30000) --  'PremiumEconomy'
   or (price > 100000) -- 'Business'

PS: Конечно, странные у вас кусочные интервалы между классами обслуживания. Скажем, показатель в 12000 выпадет из любого класса. Обычно, их делают перекрывающими диапазонами. Ну, да ладно, тем интересней для вас разбирать запрос.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
03 мая 2024, в 00:45
1000 руб./за проект
02 мая 2024, в 23:56
2000 руб./за проект
02 мая 2024, в 23:29
1500 руб./в час