SQL Server 2005/2008
我为SQL查询保留了CASE
条件,这会导致Float / Numeric Value。其中一个CASE
条件是N / A.我保留了这段代码。
对于列:Compliance
- 可能的值可能是N / A,100.0,99.1 ...(nvarchar,float)。
select
x.MemberName, x.DOB, x.FilePath,
x.Medication, x.NDC, x.Directions,
x.Name, x.Strength, x.GenericName,
x.QtyOrdered, x.DaysSupply, x.DateFilled,
CASE WHEN x.test = 0 THEN 'N/A'
WHEN compliance > 100.0 THEN '100.0'
ELSE CAST(FLOOR(compliance * 10)/10.0 AS DECIMAL(3, 1))
END AS [Compliance]
上面的语法将错误溢出为..
Msg 8114,Level 16,State 5,Line 10
将数据类型varchar转换为数字时出错。
我应该如何输入该字段?
答案 0 :(得分:4)
CASE
是一个表达式,它返回单个结果,而不管它始终需要产生相同数据类型的路径(或者可以隐式转换为相同的数据类型)。尝试:
...
CASE
WHEN x.test = 0 THEN 'N/A'
WHEN compliance > 100.0 THEN '100.0'
ELSE CONVERT(VARCHAR(5), CAST(FLOOR(compliance *10)/10.0 AS DECIMAL(3,1)))
END AS as [Compliance];
答案 1 :(得分:1)
您的CASE语句中不一致 - 您需要为所有选项提供与结果相同的数据类型。
CASE WHEN x.test = 0 THEN 'N/A'
WHEN compliance > 100.0 THEN '100.0'
ELSE CAST(FLOOR(compliance * 10)/10.0 AS DECIMAL(3, 1))
END AS [Compliance]
由于前两个选项返回一个字符串('N/A'
或'100.0'
),因此您的最后一个选项也必须返回一个字符串值:
CASE WHEN x.test = 0 THEN 'N/A'
WHEN compliance > 100.0 THEN '100.0'
ELSE CAST(CAST(FLOOR(compliance * 10)/10.0 AS DECIMAL(3, 1)) AS VARCHAR(20))
END AS [Compliance]