2011-10-05 140 views
0

我发现很多职位对where子句中coniditonal过滤,但他们似乎都基于关闭使用相同的值,如:SQL条件过滤

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语句并重复查询,但它是一个很大的,我试图避免这一点。

感谢

+1

您正在使用什么RDBMS?答案依赖于此。是的,可以在WHERE子句中使用'CASE'语句,但语法依赖于SQL的风格。 – Wil

回答

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) 
+0

谢谢!做到了! – Limey

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;