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

    @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 выпадет из любого класса. Обычно, их делают перекрывающими диапазонами. Ну, да ладно, тем интересней для вас разбирать запрос.
    Ответ написан
    Комментировать