SQL CASE INT Conversion



我试图使用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。

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

试试这个:

  • 将硬编码的整数强制转换为string/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

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

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

相关内容

最新更新