У меня проблемы с оператором SQL. У меня есть KPI (ключевой показатель эффективности), который также может иметь верхнюю и нижнюю границы. Лицо, устанавливающее KPI, может выбрать либо оба, либо ни одно из них. Я хочу отобразить сообщение на панели инструментов, которое сразу скажет, находится ли значение в границах или нет. Для наших целей нулевое значение может рассматриваться в границах, и нам не нужно указывать, какая граница нарушена.

Итак, в основном я пытаюсь построить такой оператор, как:

Check if the kpi_lower_bound is null or not If it is not null, check that the kpi_value > kpi_lower_bound Check if the kpi_upper_bound is null or not If it is not null, check that the kpi_value < kpi_lower_bound

If both statements pass or both are null, return "within bounds". If either statement fails, return "out of bounds."

Я могу проверить любую сторону границ с помощью такого оператора, как

SELECT
IF(kpi_lower_bound IS NOT NULL, (IF(kpi_value < kpi_lower_bound,"Out of lower bounds","Within lower bounds")), "It's null") AS "lower bound break", 

Но я не могу понять, как объединить несколько таких операторов if в одну большую условную проверку.

Любая помощь была бы очень признательна.

0
kathode 8 Окт 2018 в 08:11

2 ответа

Лучший ответ

Один из приемов, который мы можем попробовать, - это использовать COALESCE и заменить отсутствующие границы следующей логикой:

  1. отсутствует нижняя граница по умолчанию 2147483647
  2. отсутствует верхняя граница по умолчанию -2147483648

Затем используйте выражение CASE:

SELECT
    CASE WHEN kpi_value < COALESCE(kpi_lower_bound, -2147483648) OR
              kpi_value > COALESCE(kpi_upper_bound, 2147483647)
         THEN 'out of bounds'
         ELSE 'within bounds' END AS bounds
FROM yourTable;

Уловка здесь в том, что когда, например, kpi_lower_bound равно NULL, он заменяется на -2147483648, то есть очень маленьким числом, ниже которого мы не ожидаем, что {{X3} } когда-либо достигнет. Это дает бесплатный проход любому kpi_value, который может быть NULL, для проверки нижней границы. Та же самая логика применяется в обратном порядке для значений NULL и проверки верхней границы.

0
Tim Biegeleisen 8 Окт 2018 в 05:20

Попробуйте это с CASE WHEN

SELECT
cast when kpi_lower_bound IS NOT NULL 
   then case when kpi_value < kpi_lower_bound then 'Out of lower bounds' else 'Within lower bounds' end
else 'It''s null' end AS "lower bound break"
0
Fahmi 8 Окт 2018 в 05:16