我有一個字段,其中存儲值如>=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