2011-10-05 136 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;