Sql 基于标志的Where子句中的条件
我可以使用标志选择不同的WHERE子句吗?像这样的Sql 基于标志的Where子句中的条件,sql,tsql,Sql,Tsql,我可以使用标志选择不同的WHERE子句吗?像这样的 SELECT fields from T3 t3 left outer join T1 t1 on T1.Id=t2.Id WHERE CASE WHEN @Status <> 1 THEN (t3.Id = @SId AND sh.StatusId = 3 AND k.StatusId = 1) ELSE t2.Id = @SID AND t2.StatusID
SELECT fields
from T3 t3
left outer join T1 t1 on T1.Id=t2.Id
WHERE
CASE
WHEN @Status <> 1
THEN (t3.Id = @SId AND sh.StatusId = 3 AND k.StatusId = 1)
ELSE t2.Id = @SID AND t2.StatusID = 12
GROUP BY whatever
选择字段
从T3到T3
T1上的左外连接T1.Id=t2.Id
哪里
案例
当@Status 1
然后(t3.Id=@SId和sh.StatusId=3和k.StatusId=1)
ELSE t2.Id=@SID和t2.StatusID=12
按什么分组
为什么您需要CASE WHEN?你能在状态1和。。。或者…?您可以-只需在案例中添加一个结尾
SELECT fields
FROM T3 t3
LEFT OUTER JOIN T1 t1 on T1.Id=t2.Id
WHERE
CASE
WHEN @Status <> 1 THEN
(t3.Id = @SId AND sh.StatusId = 3 AND k.StatusId = 1)
ELSE
t2.Id = @SID AND t2.StatusID = 12
END
GROUP BY whatever
选择字段
从T3到T3
T1上的左外连接T1.Id=t2.Id
哪里
案例
当@Status 1时,则
(t3.Id=@SId和sh.StatusId=3和k.StatusId=1)
其他的
t2.Id=@SID和t2.StatusID=12
结束
按什么分组
当然可以CASE
返回一个值,因此用法如下:
where case
when @Mode = 1 and A.Foo = B.Foo then 1
when @Mode = 2 and A.Foo > B.Foo + 5 then 1
when A.Bar < @Mode then 1
else 0
end = 1
where case
当@Mode=1且A.Foo=B.Foo时,则为1
当@Mode=2且A.Foo>B.Foo+5时,则为1
当A.Bar<@模式时,则为1
其他0
结束=1
首选方式:
WHERE
(@Status <> 1 AND t3.Id = @SId AND sh.StatusId = 3 AND k.StatusId = 1)
OR (t2.Id = @SID AND t2.StatusID = 12)
在哪里
(@Status 1和t3.Id=@SId和sh.StatusId=3和k.StatusId=1)
或者(t2.Id=@SID和t2.StatusID=12)
或者这是一个更容易阅读的案例陈述:
WHERE
CASE WHEN @Status <> 1
AND t3.Id = @SId
AND sh.StatusId = 3
AND k.StatusId = 1 THEN 1
WHEN t2.Id = @SID
AND t2.StatusID = 12 THEN 1
ELSE 0 END = 1
在哪里
状态1时的情况
和t3.Id=@SId
和sh.StatusId=3
k.StatusId=1,然后是1
当t2.Id=@SID时
t2.StatusID=12,然后是1
否则0结束=1
我认为@JBrooks没有正确地翻译您的案例陈述(令人担忧的是,可能会导致误报)
我认为案例
的等价物如下:
WHERE 1 = CASE
WHEN @Status <> 1
THEN CASE
WHEN (t3.Id = @SID AND sh.StatusId = 3 AND k.StatusId = 1)
THEN 1
END
ELSE CASE
WHEN t2.Id = @SID AND t2.StatusID = 12
THEN 1
END
END
您从T3中选择并加入T1,其中T1=T2,但您在任何地方都没有加入T2?你丢失密码了吗?是的!!对不起,我打错了。我也在做同样的事情,但是得到了一个解析错误。“=”附近的语法不正确。在WHERE语句中..您是否在查询中加入T2?如果是这样的话,你能编辑问题并发布完整的查询吗?它也不适用于END。。在WHERE语句中获取解析器错误。“=”附近的语法不正确查询未完成-别名t2
无法解析。我只是复制了您的代码并添加了结尾
,以解释必要的语法更改。@user424134:我认为这些WHERE
子句都没有遵循问题中的逻辑,并且都会导致“误判”错误。看到我的答案了吗?@有一天,我同意我的答案与他的原稿不符,但他在与原稿抗争,我认为这可能是他逻辑上想要的。如果没有,写得更清楚将有助于他找到正确的逻辑。
WHERE
( p.Status = 1 OR ( t3.Id = p.SID AND sh.StatusId = 3 AND k.StatusId = 1 ) )
AND
( p.Status <> 1 OR ( t2.Id = p.SID AND t2.StatusID = 12 ) )