2015-08-13 2 views
1

У меня есть поле, которое хранит значение, как >=99.35 (сохранение целей в таблице), и позволяет сказать, что фактическое значение данных равно 78. Затем мне нужно сравнить, если цель достигнута или нет. Как я могу это сделать?SQL Compare on varchar values ​​

Я попытался положить, что в @sql переменной, которая будет говорить, как:

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

, но как я могу выполнить это @sql, чтобы получить значение 1 или 0 в поле таблицы?

+0

посмотрите EXEC sp_executesql @sql – Mark

+0

Что вы написали [динамический SQL] (https://msdn.microsoft.com/en-us/library/ms188001.aspx). В статье MSFT показано, как выполнить такой оператор. – xQbert

ответ

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 

Использование sp_executesql более вероятно кэшировать план запроса, если вы собираетесь повторно вызова этого SQL заявление.

+0

Да, это работает нормально, но мне нужно обновить другое поле со значением, возвращаемым из @sql, например: update x set field = exec (@sql) – user4946275

+0

@ user4946275: См. [Этот вопрос] (http: // stackoverflow .com/вопросы/803211/как к получить-зр-ExecuteSQL-результат-в-а-переменные). –

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 
+0

Некоторые объяснения были бы хороши. –

0

Раствор с помощью sp_executesql, как описано в других ответах будет работать нормально, но если вы собираетесь выполнения содержимого таблицы как часть динамического оператора, то вам нужно быть очень осторожными, о том, что можно сохранить в этом поле. Цели, которые вы сохраняете, всегда состоят из одного оператора и целевого значения? Если это так, было бы сложно сохранить эти два отдельно и обработать их статическим запросом. Что-то вроде:

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; 

Это немного более подробный, но, возможно, еще более безопасный. Возможно, это полезно для вашего общего дела, и, возможно, это не так; Я просто подумал, что выброшу его в качестве альтернативы.

+0

Спасибо, Джо. Я использовал этот код и изменил его, чтобы получить символы <= из поля, а затем сравнить! – user4946275