2013-03-28 42 views
0

我有了一個可空參數的存儲過程,而下面是我的查詢如何編寫有多個case的where子句?

select * 
from table1 
where table1.id = isnull(@id, table1.id) 

現在也有一些特殊的ID我區別對待。我加入另一個表表2像下面

combid id 
1   abc01 
1   abc02 
1   abc03 
2   hig01 
2   hig02 

我不得不更改查詢以滿足下列情況

  1. 如果@id爲null,where子句將table1.id = table1.id
  2. 如果@id不爲空,
    2.1如果@id存在於表2中,where子句將是table1.id in (select id from table2 where combid in (select combid from table2 where [email protected]))
    2.2否則where子句將是table1.id = @id

我試過下面的查詢,但不起作用。

select * from table1 
where ([email protected] and not exists(select * from table2 where [email protected]) 
or @id is null 
or table1.id in (select id from table2 where combid in (select combid where [email protected])) and exists(select * from table2 where [email protected])) 

如何更改存儲過程的查詢?

+1

[到底什麼,你試過嗎?(http://whathaveyoutried.com) – 2013-03-28 16:28:11

+0

是的,你嘗試過什麼? – Leng

+0

可能是http://stackoverflow.com/questions/7403301/multiple-conditions-in-where-clause將幫助你。 –

回答

1
SELECT * FROM table1 
WHERE 
    @id IS NULL 
    OR 
    (
     @id IS NOT NULL 
     AND 
     (  
      (
       EXISTS (SELECT * FROM TABLE2 WHERE id = @id) 
       AND 
       table1.id IN (SELECT id FROM table2 WHERE combid in (SELECT combid FROM table2 WHERE [email protected])) 
      ) 
      OR 
      (
       NOT EXISTS (SELECT * FROM TABLE2 WHERE id = @id) 
       AND   
       table1.id = @id 
      ) 
     ) 
    ) 
+0

這真的很慢,我必須殺死它。 – GLP

+0

不完全正確。我得到的記錄table1.id也是空的。如果我通過null,我得到了0條記錄。 – GLP

+0

我很抱歉,但只有當查詢可以返回0行以傳遞null時,纔是table1爲空時的方式。所以要麼你沒有正確地實現或解釋它,要麼我沒有理解請求,但是這個查詢工作正常。以下是SQL Fiddle演示:http://www.sqlfiddle.com/#!6/e05c0/2全部3種情況。你可以檢查它是如何工作的。如果表格中的內容不同,請使用sql小提琴提供更好的示例數據和預期結果。 –

0

您可以使用if ... else ...而不是隻寫一條SELECT語句,使用,否則爲您的案例更容易閱讀。


if(@id is null) 
    select * from table1 
else if exists (select 1 from table2 where id = @id) 
    select * from table1 
    where table1.id in 
        (select id from table2 where combid in 
         (select combid from table2 where [email protected]) 
       ) 
else 
    select * from table1 where [email protected] 
+0

謝謝。但是我需要把所有的邏輯放在where子句中。 – GLP

+0

我也不能使用這種方法,因爲我會將結果插入臨時表中。 – GLP

+2

爲什麼你必須把所有的邏輯放在where子句中?你仍然可以在IF ... ELSE ...中插入臨時表,在每次選擇之前,將插入添加到@temptable ... – ljh