SQL比较varchar值

时间:2015-08-13 14:07:07

标签: sql-server

我有一个存储像>=99.35这样的值的字段(在表中存储目标)并且假设实际数据值是78.然后我需要比较目标是否满足。我怎么能做到这一点?

我试着把它放在一个@sql变量中,它会像:

Select case when 78>=99.35 then 1 else 0 end

但是如何执行此@sql以获取表格字段中的值1或0?

3 个答案:

答案 0 :(得分:0)

DECLARE @sql VARCHAR(1000);
DECLARE @Result INT;

SET @Result = 78;
SET @sql = 'SELECT CASE WHEN ' + @Result + ' >=99.35 THEN 1 ELSE 0 END'

EXEC sp_executesql @sql 

如果您要重复调用此SQL语句,则使用sp_executesql更有可能缓存查询计划。

答案 1 :(得分:0)

DECLARE @ActualValue INT = 100

DECLARE @SQLQuery nVARCHAR(MAX) = ''

SET @SQLQuery = ( SELECT 'SELECT CASE WHEN '+CONVERT(VARCHAR,@ActualValue)+ YourColumn+ 'THEN 1 ELSE 0 END AS ResultValue'  FROM YourTable )


EXECUTE sp_executesql  @SQLQuery

答案 2 :(得分:0)

使用其他答案中描述的sp_executesql的解决方案可以正常工作,但如果您要将表的内容作为动态SQL语句的一部分执行,那么您需要非常小心关于可以存储在该领域的内容。您存储的目标是否始终由单个运算符和目标值组成?如果是这样,将两者分开存储并使用静态查询处理它们并不困难。类似的东西:

declare @SampleData table
(
    [ActualValue] decimal(11, 2), 
    [Operator] varchar(2), 
    [ReferenceValue] decimal(11, 2)
);
insert @SampleData values
    (100, '>=', 98.25),
    (100, '<=', 98.25),
    (100, 'G', 98.25);

select
    [ActualValue],
    [Operator],
    [ReferenceValue],
    [GoalMet] = case [Operator]
        when '>=' then case when [ActualValue] >= [ReferenceValue] then 1 else 0 end
        when '<=' then case when [ActualValue] <= [ReferenceValue] then 1 else 0 end
        /*...other operators here if needed...*/
        else null
    end
from
    @SampleData;

这有点冗长,但也许更安全一些。也许它可以用于你的一般情况,也许它不是;我以为我会把它扔出去作为另一种选择。