我的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吗?
答案 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))