2013-03-06 61 views
1

我想創建像下面這樣的語句中的SELECT語句:sql中,如果條件

if (select statement1 returns rows){ 
    select statement2 
} 
else { 
    select statement3 
} 

if語句是一個更大的查詢

select from products where p.id in (
     if (select statement1 returns rows){ 
      select statement2 
     } 
     else { 
     select statement3 
     } 

的一部分,這是可能在SQL Server中,或我的想法是不正確的?

+3

我認爲你想用C#運行這個數據庫? – Brian 2013-03-06 19:36:39

+0

這個select語句的上下文是什麼?您是否在存儲過程中測試可選參數? – supergrady 2013-03-06 19:47:22

回答

3

您需要使用的EXISTSCASE..END組合:

select * 
from products 
where p.id in (
    case when (exists (<statement1>)) 
    then (<statement2>) 
    else (<statement3>) 
    end 
) 

<statement1>可能是:SELECT * FROM Customer WHERE Id = 123

<statement2>可能是:SELECT MIN(field) FROM someTable

<statement3>可能是:SELECT 0 as DefaultValue

如果你能展示一些你想要那些實際陳述的例子,我可以提供一個更具體的答案。

+0

謝謝!這就是我需要開始的一切。內部查詢令我感到困惑,但我想通了。 – heyNow 2013-03-07 19:30:38

1

實際上,由於性能方面的考慮,SQL更爲嚴格。您的查詢將看起來更像是這樣的:

select * 
from products 
where 1 = case when (exists (<statement1>)) 
       then case when p.id in (<statement2>) then 1 else 0 end 
       else case when p.id in (<statement3>) then 1 else 0 end 
      end 
1

由於要檢查同一id所有腦幹,我想你可以做一個UNION這裏。

select * 
from products 
where p.id in (select id from table1 
       union 
       select id from table2) 
1

我建議在兩個條件之間使用UNION以幫助避免性能問題......並且也可能更易於閱讀。

SELECT FROM products p 
    WHERE EXISTS (SELECT STATEMENT1) 
    AND EXISTS (SELECT STATEMENT2 s2 WHERE s2.p_id = p.id) 
    UNION 
    SELECT FROM products p 
    WHERE NOT EXISTS (SELECT STATEMENT1) 
    AND EXISTS (SELECT STATEMENT3 s3 WHERE s3.p_id = p.id)  

根據聲明的性質,您可能可以在第二個選擇中忽略不存在。