我有一个脚本,我有以下案例表达。
正在发生的奇怪事情是SQL会将所有结果转换为Decimal 18,1。甚至是metricid 1记录应该转换为int。
SELECT CASE
WHEN metricid = 1 then cast(result as int)
WHEN metricid = 2 then cast(result as decimal(18,1)
END as column1
from sometable
我甚至添加了类似下面的内容作为第二个不应该评估的条件,因为1不是= 3(对吗?)但它仍然将所有结果转换为十进制:
WHEN 1=3 and metricid = 2 then cast(result as decimal(18,1)
我想我打破了SQL:....(
答案 0 :(得分:4)
SQL在一列中只允许一种数据类型。可能的解决方案可能是将输出转换为VARCHAR
。例如,请考虑以下示例:
DECLARE @metricid INT
DECLARE @result INT
SET @metricid = 2 --(or 1)
SET @result = 20
SELECT CASE WHEN @metricid = 1 then CAST(CAST(@result as int) AS VARCHAR(55))
WHEN @metricid = 2 then CAST(CAST(@result as decimal(18,1)) AS VARCHAR(55))
ELSE ''
END Result
CASE表达式的The return type是result_expressions中类型集和可选else_result_expression中的最高优先级类型。可以检查数据类型的优先级here。
SQL-Server 2012 +
SELECT CASE WHEN @metricid = 1 then FORMAT(@result, '#')
WHEN @metricid = 2 then FORMAT(@result, '#.0')
ELSE ''
END Result