选择不工作中的案例陈述

时间:2016-03-24 15:03:37

标签: sql-server case

这适用于SQL Server 2012数据库......

我正在从表中读取varchar数据列,并且根据用户选择的选项,数据可以是字母数字或数字。我需要按照此列进行排序,以便我尝试使用案例陈述,但它似乎并没有起作用。下面是我正在做的事情的一个简化示例,但正如您所看到的,它在两种情况下都落入了案例陈述的其他部分......关于我在做什么的任何想法错?

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 

2 个答案:

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

为什么呢?因为每个表达式都必须具有明确定义的数据类型。 SQL Server推断出第一列的类型是int,因为ELSE子句包含int。因此,它试图将topic转换为int,但失败了。

换句话说:你不能这样做。结果集中的字段可以是varchar int,而不是两者。

答案 1 :(得分: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尝试将所有内容转换为具有更高优先级的类型