2013-06-26 32 views
-1

我想要做的是寫一個查詢,基於布爾將選擇行滿足兩個條件或至少有一個兩個。SQL查詢清理 - 和/或基於條件

以下是完成工作的簡化查詢。事情是,我的查詢中的where子句更加複雜,所以我正在尋找一種以更易讀的方式重寫它的方法。

這可能嗎?

declare @AndParam bit 
set @AndParam = 1 

SELECT * FROM Table 

    Where 
    (@AndParam = 1 
    AND 
    (Table.CategoryID = 3 
    AND 
    Table.Age < 30)) 

    OR 

    (@AndParam = 0 
    AND 
    (Table.CategoryID = 3 
    OR 
    Table.Age < 30)) 

編輯:
這個問題確實是關於可讀性和美學。
代替Table.Age < 30還有五個額外的檢查包括子查詢。實際上,這意味着我有大量的代碼只有一個區別, 和/或
看到SQL如何難以閱讀我正在修復它。

+0

在我看來,這是最小的一組條款,不能再減少。如果'@ AndParam'是布爾值,你可以寫'@ AndParam'和'NOT @ AndParam'。但這只是語法上的糖。 – nif

回答

0

也許是這樣的:

Where 
    CASE WHEN Table.CategoryID = 3 THEN 1 ELSE 0 END + 
    CASE WHEN Table.Age < 30 THEN 1 ELSE 0 END -- + more CASEs for each condition 
    >= 
     CASE WHEN @AndParam = 1 THEN 2 ELSE 1 END 
     --For more conditions, change 2 above to however many conditions there are 

你基本上使每個條件給你一個1或0,然後添加所有這些起來 - 然後你做了最後的檢查,根據@AndParam您是否打條件總數或至少爲1.

+0

謝謝:)我想看看這是否會影響性能。 –