如何将字符串作为整数进行比较

时间:2016-09-27 21:02:58

标签: sql sql-server casting

SQL Server 2012 中,我有一组定义为VARCHAR的列。值是度量的阈值,可以是数字或字符串值。例如,温度阈值为数字0100,而门的阈值为openclosed

我想测试一个值[ResponseValue],看看它是否位于两个定义阈值[Value_Threshold_min][Value_Threshold_max]之间。 [ResponseValue]可以是NUMERICVARCHAR,但始终存储为VARCHARThreshold_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 

比较时,如何将数字视为数字,将字符串视为字符串?

2 个答案:

答案 0 :(得分:1)

自2012年起,您可以使用TRY_CONVERT

  

如果转换成功,则返回强制转换为指定数据类型的值;   否则,返回null。

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

答案 1 :(得分: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;