我有一个字段,其中存储值如>=99.35
(在表中存储目标),可以说实际数据值是78.然后我需要比较目标是否满足。我怎样才能做到这一点?SQL比较varchar值
我试图把在一个@sql
变量,它会说这样的:
Select case when 78>=99.35 then 1 else 0 end
,但我怎么能执行此@sql
得到一个表中的字段的值1或0?
我有一个字段,其中存储值如>=99.35
(在表中存储目标),可以说实际数据值是78.然后我需要比较目标是否满足。我怎样才能做到这一点?SQL比较varchar值
我试图把在一个@sql
变量,它会说这样的:
Select case when 78>=99.35 then 1 else 0 end
,但我怎么能执行此@sql
得到一个表中的字段的值1或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
更有可能缓存查询计划。
是的,这运行良好,但我需要更新另一个字段与从@sql返回的值 - 更新x set field = exec(@sql) – user4946275
@ user4946275:请参见[this question](http:// stackoverflow .COM /问题/ 803211 /如何对获得-SP-的ExecuteSQL - 结果 - 到 - 一个变量)。 –
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
有些解释会很好。 –
使用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;
这有点冗长,但也许更安全一些。也许它适用于你的一般情况,也许它不是;我只是认为我会把它放在那里作为替代。
谢谢乔。我已经使用这段代码并进行了修改,以便从字段中获取<=符号,然后进行比较! – user4946275
看看EXEC sp_executesql @sql – Mark
你写的是[动态SQL](https://msdn.microsoft.com/en-us/library/ms188001.aspx)。 MSFT文章展示了如何执行这样的声明。 – xQbert