Я предлагаю изменить вашу таблицу на что-то более простое для интерпретации и запроса.Следующие операторы создают новую таблицу и преобразуют ваши правила в новый формат.Позже вы увидите, насколько просто запросить эту новую таблицу.
Предлагаемая таблица имеет нижний + верхний предел для каждого цвета:
CREATE TABLE UpdatedRangeColor (
range_color_id INT PRIMARY KEY,
range_color VARCHAR(50) NOT NULL,
LowerLimit INT,
HigherLimit INT)
Это преобразует текущие правила в новую таблицу:
CREATE TABLE UpdatedRangeColor (
range_color_id INT PRIMARY KEY,
range_color VARCHAR(50) NOT NULL,
LowerLimit INT,
HigherLimit INT)
;WITH HigherRule AS
(
SELECT
R.*,
IsRuleHigher = CASE WHEN R.range_operator LIKE '%>%' THEN 1 ELSE 0 END
FROM
range_color AS R
),
TemporaryLimits AS
(
select
R.*,
TemporaryLowerLimit = CASE WHEN R.IsRuleHigher = 1 THEN R.range_number END,
TemporaryHigherLimit = CASE WHEN R.IsRuleHigher = 0 THEN R.range_number END,
Partition = ROW_NUMBER() OVER (
PARTITION BY
CASE WHEN R.IsRuleHigher = 1 THEN 1 ELSE 2 END
ORDER BY
ABS(R.range_number))
from
HigherRule AS R
)
INSERT INTO UpdatedRangeColor (
range_color_id,
range_color,
LowerLimit,
HigherLimit)
SELECT
T.range_color_id,
T.range_color,
LowerLimit = CASE
WHEN T.IsRuleHigher = 1 THEN T.TemporaryLowerLimit
ELSE LAG(T.TemporaryHigherLimit, 1, -999) OVER (PARTITION BY T.IsRuleHigher ORDER BY T.Partition DESC) END,
HigherLimit = CASE
WHEN T.IsRuleHigher = 1 THEN LEAD(T.TemporaryLowerLimit, 1, 999) OVER (PARTITION BY T.IsRuleHigher ORDER BY T.Partition ASC)
ELSE T.TemporaryHigherLimit END
FROM
TemporaryLimits AS T
Вставлены следующие строки:
range_color_id range_color LowerLimit HigherLimit
1 RED -999 0
2 BLUE 0 5
3 PURPLE 5 8
4 ORANGE 8 12
5 GREEN 12 999
Затем вы можете просто выполнить прямой запрос с двумя условиями (обязательно проверьте, где должен быть включен знак равенства):
DECLARE @ParameterValue FLOAT = 5.648
SELECT
*
FROM
UpdatedRangeColor AS U
WHERE
@ParameterValue >= U.LowerLimit AND
@ParameterValue < U.HigherLimit
Результат:
range_color_id range_color LowerLimit HigherLimit
3 PURPLE 5 8
Недостатком этого подхода является поддержание этой новой таблицы, вам придется сохранять согласованность записей при вставке новых значений или обновлении (или использовать этопроцедура перевода исходных строк в новый формат каждый раз, когда добавляются новые записи).