SQL Server:转换列数据类型

时间:2011-08-24 18:26:20

标签: sql sql-server-2005 sql-server-2008

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转换为数字时出错。

我应该如何输入该字段?

2 个答案:

答案 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]