2016-09-16 43 views
2

我在我的项目中有以下case statememtcase case case

tbl_ExceptionStatus.ExceptionStatusValue IN (case when @excstat='Awaiting ERR Approval' then ('1') else @excstat END) 

这是工作正常,但我必须将它更改为这个

tbl_ExceptionStatus.ExceptionStatusValue IN (case when @excstat='Awaiting ERR Approval' then ('1','2','3') else @excstat END) 

其转换为varchar值“1,2,3”为数据类型SMALLINT时给错误 转换失败。

我如何能够更改我的case statememt来终止错误?

回答

3

你有形式

A IN (CASE WHEN @x='someString' THEN ('1', '2', '3') ELSE @x END) 

这是无效的(你不能返回一个case语句列表)的声明。

如下您可以把它改写:

(@x = 'someString' AND A IN ('1', '2', '3')) 
OR (@x <> 'someString' AND A = @x) 

如果A永远不能'someString',这可以简化为

A = @x OR (@x = 'someString' AND A IN ('1', '2', '3')) 
+0

我将如何使用这个在我的地方声明我不明白 – Ashu

+0

@Ashu:什么你不明白?你只需要用'tbl_ExceptionStatus.ExceptionStatusValue'替换'A'等。 – Heinzi

1

Case语句如下类型优先级,无论数据类型是hightest在当时和else试图将它们转换为该数据类型。参见下面的示例

declare @a int 
set @a=1 

select case when @a=1 then 'a' else 2 end 

转换失败你的情况转换将varchar值 'a' 为数据类型int

当0

上述失败

then ('1,2,3')--varchar 
else @excstat ----int 
查询的

书面形式没有按” t投掷错误

('1','2','3') 

但这是..

'1,2,3' 
+0

我将如何在我不明白的where语句中使用它 – Ashu