2016-03-24 127 views
1

這是SQL Server 2012數據庫...Case語句不工作

我讀從表中VARCHAR數據列,並根據用戶選擇的選項中的數據可能是字母數字或數字。我需要按這個列排序,所以我試圖使用一個case語句,但它似乎沒有工作。以下是我正在做的事情的一個簡單例子,但正如你所看到的,它在兩種情況下都流傳到案例陳述的其他部分......關於我在做什麼錯誤的任何想法?

Select '1st Grade Math' topic Into #temp 

Declare @rptView int 
Set @rptView = 1 

Select Case @rptView 
     When 1 Then topic 
     Else cast(topic as int) 
    End 
From #temp 
Order by Case @rptView 
     When 1 Then topic 
     Else cast(topic as int) 
    End 

Select Case 
     When @rptView = 1 Then topic 
     Else cast(topic as int) 
    End 
From #temp 
Order by Case @rptView 
     When 1 Then topic 
     Else cast(topic as int) 
    End 

drop table #temp 
+0

你正在嘗試做的是用'varchar'和'int'數據類型創建一個列。這是無法完成的。 – HoneyBadger

+0

我認爲這個錯誤代表了自身信息245,級別16,狀態1,行6 將varchar值'1st Grade Math'轉換爲數據類型int時轉換失敗。 - cast(主題爲int) – Vincent

+1

case語句中的每個結果都必須返回相同的數據類型,因此如其他地方所述,它會嘗試將結果轉換爲常用數據類型,即具有最高[數據類型優先順序](https: //msdn.microsoft.com/en-GB/library/ms190309.aspx)。正如你所看到的,INT比varchar更高,這就是爲什麼它會嘗試輸出INT而不是其他方式。 – Bridge

回答

1

考慮根據你的桌子下面的例子:

Select Case 1 When 1 Then topic 
         Else 5 
       End 
    From #temp 

失敗,出現以下錯誤:

Conversion failed when converting the varchar value '1st Grade Math' to data type int. 

爲什麼?因爲每個表達式都必須有一個明確定義的數據類型。由於ELSE子句包含一個int,因此SQL Server推斷您的第一列的類型爲int。因此,它試圖將topic也轉換爲int,失敗。

換句話說:你不能這樣做。結果集中的字段可以是varchar int,而不是兩者。

+0

支持Heinzi和@Bridge清楚地解釋我做錯了什麼 - 非常感謝。 我的假設是,在Case語句中,它會掉入正確的場景並遵循這些指令而不關心其他指令集正在做什麼,所以只要我保持與字段類型一致,我就可以做到我試圖去做。哦,回到畫板! –

+0

我是否也可以請求一些專業禮貌,並解釋爲什麼這個問題被拒絕? –

+1

@JimmyGenslinger:我認爲這是一個很好的問題,它包括一個偉大的[mcve]! (我對之前沒有提出過贊成的做法感到羞恥)我要改進的事情是(1)將錯誤信息添加到問題本身中,以便人們不必嘗試查看錯誤, 2)修復SQL示例的縮進和大小寫不一致。也許其中之一是downvote的原因,但我只能推測。 – Heinzi

0

添加幾個例子可以幫助..

declare @a int=1 
declare @b varchar='b' 

--this works 
select 
case when @a=1 then @a else @b end 

--this also works 
select 
case when @a=2 then @b else @b end 


--this fails 
select 
case when @a=1 then @b else @a end 

--this fails 
select 
case when @a=2 then @a else @b end 

爲什麼......?因爲數據類型的優先順序,SQL會嘗試一切轉換具有更高的優先級鍵入