2011-09-08 76 views
0

我试图用CASE到包括使用以下字符和NULL和空白项组表内容:SQL CASE INT转换

SELECT COUNT(*) AS Clients, 
    CASE WHEN t.Diagnosedin = 'Unknown' OR t.Diagnosedin ='' THEN 'Unknown' 
    ELSE CASE WHEN CAST((CAST(DATENAME(Year,GETDATE()) AS INT)- t.Diagnosedin)AS varchar(5)) =1 THEN 1 
    ELSE CASE WHEN CAST((CAST(DATENAME(Year,GETDATE()) AS INT)- t.Diagnosedin)AS varchar(5)) <=2 THEN 2 
    ELSE CASE WHEN CAST((CAST(DATENAME(Year,GETDATE()) AS INT)- t.Diagnosedin)AS varchar(5)) <=5 THEN 5 
    ELSE CASE WHEN CAST((CAST(DATENAME(Year,GETDATE()) AS INT)- t.Diagnosedin)AS varchar(5)) <=10 THEN 10 
    ELSE CASE WHEN CAST((CAST(DATENAME(Year,GETDATE()) AS INT)- t.Diagnosedin)AS varchar(5))>=10 THEN '+10 ' 
    END 
    END 
    END 
    END 
    END 
    END AS Years 

我收到以下错误:Conversion failed when converting the varchar value 'Unknown' to data type int.,我使用MS SQL 2008 。 在此先感谢。

回答

3

发生了什么是您在列Years列中混合了不同数据类型的文字。 (即int 5和varchar Unknown将在相同的结果集中)。您需要将这些文字值编码为相同的数据类型。

试试这个:

  • 投你的硬编码的整数转换为字符串/ VARCHAR。我已使用STR()函数,并使用LRTIM()确保不保留领先空间。
  • 使用相同CASE
SELECT COUNT(*) AS Clients, 
    CASE WHEN t.Diagnosedin = 'Unknown' OR t.Diagnosedin ='' THEN 'Unknown' 
    WHEN CAST((CAST(DATENAME(Year,GETDATE()) AS INT)- t.Diagnosedin)AS varchar(5)) =1 THEN LTRIM(STR(1)) 
    WHEN CAST((CAST(DATENAME(Year,GETDATE()) AS INT)- t.Diagnosedin)AS varchar(5)) <=2 THEN LTRIM(STR(2)) 
    WHEN CAST((CAST(DATENAME(Year,GETDATE()) AS INT)- t.Diagnosedin)AS varchar(5)) <=5 THEN LTRIM(STR(5)) 
    WHEN CAST((CAST(DATENAME(Year,GETDATE()) AS INT)- t.Diagnosedin)AS varchar(5)) <=10 THEN LTRIM(STR(10)) 
    WHEN CAST((CAST(DATENAME(Year,GETDATE()) AS INT)- t.Diagnosedin)AS varchar(5))>=10 THEN '+10 ' 
END AS Years 
+0

谢谢,它工作,除了我得到两行与未知? – hncl

+0

听起来就像您的表格中有两行,其中“Diagnosedin”的值为空或“未知”。你可能需要一个GROUP BY子句来帮助。 –

+0

感谢您的帮助,会做。 – hncl

1

答案就在你面前。您只能在列中返回一种数据类型。您的第一个WHEN语句将Unknown(字符串)建立为一个值。后续的语句传递整数值。数据库引擎说我有一个整数,我需要在其中插入一个字符串,这不适合。

选项是将转换添加到所有数字操作,以将它们转换为varchar(n)(如p.campbell刚刚提交)或将您的Unknown值更改为NULL或明显无效的定位值,如 - 1。

+0

谢谢你的解释 – hncl