SQL Server хранить операторы сравнения в базе данных и использовать в случае заявления

У меня есть требование хранить символы оператора сравнения в базе данных sql, а затем использовать эти операторы сравнения incase в других столбцах для отображения результата. Могу ли я узнать, как получить значение оператора сравнения в операторе case, а затем использовать их в случае...

Нечто подобное.. образец таблицы

Теперь мне нужно применить оператор из столбца символов к другим столбцам и проверить, выполнено ли условие, соответственно отобразить результат. Как мне этого добиться?

1 ответ

Решение

Вы можете создать такую ​​функцию, которая поддерживает операторы>,>=,<, <= и =:

CREATE FUNCTION func_Generic_Compare 
(

    @Param1 float,
    @Param2 float,
    @operator varchar(2)

)
RETURNS nvarchar(5)
AS
BEGIN

if @operator = '>' or @operator = '>='
   if @Param1 > @Param2 
       return 'True'

if @operator = '<' or @operator = '<='
   if @Param1 < @Param2 
       return 'True'

if @operator = '=' or @operator = '<=' or @operator = '>='
   if @Param1 = @Param2 
       return 'True'

RETURN 'False'

END  

А потом использовать select dbo.func_Generic_Compare (col1,col2,operator) as Result from table

Использование такой функции окажет серьезное влияние на производительность (она обрабатывается "строка за агонизирующей строкой"!), Но подойдет для небольших наборов данных.

Другим вариантом будет вложенный регистр. для ясности вы можете сделать это в два этапа

Select col1, col2, operator,
case when operator='>' then 
    greater 
else 
    case when operator='<' then 
        less 
    else 
        equal 
    end 
end as result 

from

(Select 
     col1, 
     col2,
     operator, 
     col1>col2 as greater, 
     col1<col2 as less, 
     col1=col2 as equal
from 
compare) as PreCalculated

SQLFiddle

Другой вариант будет

Select Col1, Col2, Col1>Col2  as Results
from Table
where operator = '>'
union all

Select Col1, Col2, Col1<Col2 
from Table
where operator = '<'
union all

Select Col1, Col2, Col1<Col2 
from Table
where operator = '=' 
Другие вопросы по тегам