Оператор Mysql IF, который проверяет несколько значений, которые могут быть нулевыми - PullRequest
0 голосов
/ 08 октября 2018

Мне нелегко с оператором 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 в одну большую условную проверку.

Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

0 голосов
/ 08 октября 2018

Один прием, который мы можем попытаться использовать, это использовать 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,is заменяется на -2147483648, то есть очень маленькое число, ниже которого мы не ожидаем, что kpi_value когда-либо достигнет.Это дает свободный проход любому kpi_value, который может быть NULL, для проверки нижней границы.Та же логика применяется в обратном порядке для значений NULL и проверки верхней границы.

0 голосов
/ 08 октября 2018

Попробуйте это с 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"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...