admin

如何将字符串比较为整数

sql

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

我想测试一个值[ResponseValue],看它是否是在之间的两个定义的阈值,[Value_Threshold_min][Value_Threshold_max]。该[ResponseValue]可以是NUMERICVARCHAR,但总是存储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

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


阅读 195

收藏
2021-06-07

共1个答案

admin

由于您在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
2021-06-07