在 SQL Server 2012中 ,我有一组定义为的列VARCHAR。值是指标的阈值,可以是数字或字符串值。例如,温度的阈值为数字0和100,而门的阈值为open和closed。
VARCHAR
0
100
open
closed
我想测试一个值[ResponseValue],看它是否是在之间的两个定义的阈值,[Value_Threshold_min]和[Value_Threshold_max]。该[ResponseValue]可以是NUMERIC或VARCHAR,但总是存储VARCHAR。该Threshold_max/min存储为VARCHAR。
[ResponseValue]
[Value_Threshold_min]
[Value_Threshold_max]
NUMERIC
Threshold_max/min
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
比较时,如何将数字视为数字,将字符串视为字符串?
由于您在2012年,因此可以使用TRY_CONVERT。
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