在 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 :(得分: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;