这适用于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
答案 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尝试将所有内容转换为具有更高优先级的类型