我在where子句中发现了许多关于coniditonal过滤的帖子,但它们似乎都是基于使用相同的值,例如:
WHERE (o.OrderID = @orderid OR @orderid IS NULL)
我需要做一些稍微不同的事情,我需要删除一个过滤器,它的值完全基于另一个值,所以类似于:
select *
from tableA
where 1 = 1
case when a = 1 then
and b in (select b from tableB)
else
-- do nothing
end
我知道上面的内容是不被允许的,我只是写作我要做的事情的一个例子。有没有人知道这样做的好方法?我知道我可以使用if语句并复制查询,但它很大,我试图避免这种情况。
由于
答案 0 :(得分:2)
SELECT *
FROM tableA
WHERE a <> 1
OR (a = 1 AND EXISTS(SELECT b from TableB WHERE tableA.b = TableB.b))
您也可以将其写为:
SELECT tableA.*
FROM tableA
LEFT JOIN tableB
ON tableA.b = tableB.b
WHERE tableA.a <> 1
OR (tableA.a = 1 AND tableB.b IS NOT NULL)
答案 1 :(得分:0)
“更正”您的WHERE
条款:
select *
from tableA
where 'T' = case
when a = 1 then case
when b in (select b from tableB) then 'T'
end
else 'T'
end;