SQL CASE INT转换

时间:2011-09-08 01:57:54

标签: sql

我正在尝试使用CASE使用以下内容对包含字符和NULL以及空白条目的表内容进行分组:

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。 提前谢谢。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

答案就在你面前。您只能在列中返回一种数据类型。您的第一个WHEN语句将Unknown(字符串)设置为值。后续语句提供整数值。 db引擎说我有一个整数,我需要在其中粘贴一个字符串,这将不适合。

选项是为所有数值操作添加一个强制转换,以将它们转换为varchar(n){作为p.campbell刚提交}或将您的未知值更改为类似NULL或明显无效的标记值(如-1)