案件陈述中的问题

时间:2016-09-16 09:13:45

标签: sql-server

我的项目中有以下case statememt

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以终止错误?

2 个答案:

答案 0 :(得分:3)

您有一份表格

的陈述
\d+(?:[.,]\d+‌​)*(?:\s*k)?

无效(您无法在案例陈述中返回列表)。

您可以按如下方式重写它:

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

如果 (@x = 'someString' AND A IN ('1', '2', '3')) OR (@x <> 'someString' AND A = @x) 永远不能A,则可以简化为

'someString'

答案 1 :(得分:1)

Case语句遵循数据类型优先级,无论数据类型在then和else子句中是否为高,它都会尝试将它们转换为该数据类型。参见下面的示例

declare @a int
set @a=1

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

上面的失败

  

将varchar值'a'转换为数据类型int

时转换失败

在你的情况下

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

您的查询的书面形式不会抛出错误

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

但这确实......

'1,2,3'