2016-09-27 7 views
1

В SQL Server 2012 У меня есть набор столбцов, которые определены как VARCHAR. Значения являются пороговыми значениями для метрики и могут быть либо числами, либо строковыми значениями. Например, порогами для температуры являются числа 0 и 100, тогда как пороги для двери будут open и closed.Как сравнить строку как целое число

Я хочу проверить значение [ResponseValue], чтобы узнать, находится ли оно между двумя пороговыми значениями определения, [Value_Threshold_min] и [Value_Threshold_max]. [ResponseValue] может быть либо NUMERIC, либо VARCHAR, но всегда хранится как VARCHAR. Threshold_max/min хранятся как VARCHAR.

SELECT responsevalue 
     , (CASE WHEN ResponseValue BETWEEN steps.value_threshold_min AND steps.Value_Threshold_max else END THEN column_color 
FROM steps 
JOIN responses on responses.stepid = steps.id 
WHERE stepid = 4447 

Это не проверяет значения, которые являются числовыми. Например, 12, как говорят, находится между 100 и 200, потому что он оценивается как строка.

Я попытался проверить, является ли значение числовым, и если да, добавьте его в int, но это не выполняется, когда значение является буквенно-цифровым.

CASE WHEN isnumeric([Responses].[ResponseValue]) = 1 
THEN CAST([Responses].[ResponseValue] as int) 
ELSE [Responses].[ResponseValue] END) 
BETWEEN steps.value_threshold_min AND steps.Value_Threshold_max THEN column _color 

Как я могу рассматривать число как число и строку как строку при сравнении?

+0

какая версия SQL, 2008, 2012, и т.д. – scsimon

+0

сервера SQL 2012 –

+0

Тогда обязательно использовать 'TRY_CONVERT()' вместо 'ISNUMERIC'. 'ISNUMERIC' может привести к ложным срабатываниям для этого ... т. Е. Попробуйте' SELECT ISNUMERIC ('1e4') ' – scsimon

ответ

0
SELECT responsevalue, 
    CASE 
     WHEN TRY_CONVERT(INT,ResponseValue) BETWEEN TRY_CONVERT(INT,steps.value_threshold_min) AND TRY_CONVERT(INT,steps.Value_Threshold_max) THEN 'Int Color' 
     WHEN ResponseValue BETWEEN steps.value_threshold_min AND steps.Value_Threshold_max THEN 'VarcharColor' 
     ELSE NULL 
    END as column_color 
FROM steps 
JOIN responses on responses.stepid = steps.id 
WHERE stepid = 4447 
+0

Это отлично работает! Спасибо за решение. –

+0

Не беспокойтесь @DavidWinslow – scsimon

0

Ну, если вы знаете значений являются допустимыми цифрами, вы можете просто конвертировать их:

SELECT responsevalue, 
     (CASE WHEN r.ResponseValue BETWEEN convert(int, s.value_threshold_min) AND convert(int, s.Value_Threshold_max) 
       ELSE . . . 
     END) column_color 
FROM steps s JOIN 
    responses r 
    on r.stepid = s.id 
WHERE stepid = 4447; 

Это может вызвать проблемы, если некоторые значения строк и некоторые Интс - и это может даже происходят в строках, которые не выбираются по запросу. Если это вопрос, то в SQL Server 2012+, вы можете использовать try_convert():

SELECT responsevalue, 
     (CASE WHEN r.ResponseValue BETWEEN try_convert(int, s.value_threshold_min) AND try_convert(int, s.Value_Threshold_max) 
       ELSE . . . 
     END) column_color 
FROM steps s JOIN 
    responses r 
    on r.stepid = s.id 
WHERE stepid = 4447; 
+0

Я получаю ту же ошибку, что и я, с isnumeric. Ошибка конверсии при преобразовании значения varchar 'Да' в тип данных int. [SQL State = S0001, DB Errorcode = 245]. Значения в responseValue могут быть числами или строками. Когда они являются числами, мне нужно рассматривать их как числа для работы «между» для работы. Я не могу рассматривать все как числа, потому что некоторые из значений являются строками. –

+0

@DavidWinslow. , , Используете ли вы 'try_convert()', как я рекомендовал? –

+0

@GordonLinoff Я думаю, что это на столбце responsevalue, но может быть неправильным – scsimon

Смежные вопросы