CASE和IN在哪里

时间:2015-04-17 08:35:28

标签: sql sql-server

我的SQL Server请求存在问题:

SELECT *
FROM table 
WHERE M.StatutMandatId = 

CASE
    WHEN @Mandat = '1' THEN '5'
    WHEN @Mandat = '0' THEN 'IN(1,2,3,4,5)'
END

但我有这个问题:

  

将varchar值'IN(1,2,3)'转换为时,转换失败   数据类型int。

不可能像那样使用IN吗?

3 个答案:

答案 0 :(得分:5)

不,你不能像那样创建动态SQL。您可以使用以下语句实现相同的目标

SELECT *
FROM table 
WHERE (M.StatutMandatId IN(1,2,3,4,5) AND @Mandat=0)
OR (M.StatutMandatId =5 AND @Mandat=1)

答案 1 :(得分:4)

你不能这样做IN,而是你必须使用CASE这样做:

SELECT *
FROM table 
WHERE
CASE
    WHEN @Mandat = '1' AND M.StatutMandatId = 5 THEN 1
    WHEN @Mandat = '0' AND M.StatutMandatId IN(1,2,3,4,5) THEN 1
    ELSE 0
END = 1

它可能不会非常高效,我会像这样重组它:

SELECT *
FROM table 
WHERE
    (@Mandat = '1' AND M.StatutMandatId = 5)
 OR (@Mandat = '0' AND M.StatutMandatId IN(1,2,3,4,5))

答案 2 :(得分:0)

如果你真的想在下面的地方使用caseand IN(需要使用临时表)。

DECLARE @StatutMandatIds table (meetingstatus int)

insert into @StatutMandatIds select 1
insert into @StatutMandatIds select 2
insert into @StatutMandatIds select 3
insert into @StatutMandatIds select 4
insert into @StatutMandatIds select 5

SELECT *
FROM table 
WHERE M.StatutMandatId IN 
(CASE
    WHEN @Mandat = '1' THEN 5
    WHEN @Mandat = '0' THEN (select * from @StatutMandatIds)
END)

或者你可以像这样简化

SELECT *
FROM table 
WHERE (@Mandat= '1' AND M.StatutMandatId = 5) OR (@Mandat = '0' AND M.StatutMandatId IN (1,2,3,4,5))