2011-09-08 90 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