2010-05-11 106 views
2

我需要檢查三個條件切換情況:在where子句

if @filter = 1 
{ 
    select * from employeestable where rating is not null 
} 
else if @filter = 2 
{ 
    select * from employeestable where rating is null 
} 
else 
{ 
    select * from employeestable 
} 

爲此,我需要用一個case語句做。現在我有超過30行的查詢,如果我使用的情況下,我可以減少我的代碼高達70%
請讓我現在如何做到這一點。

回答

6

這個怎麼樣?

WHERE (@filter = 1 AND rating IS NOT NULL) 
OR  (@filter = 2 AND rating IS NULL) 
OR  (@filter <> 1 AND @filter <> 2) 
0

您可以利用位邏輯。

測試數據

DECLARE @employeestable TABLE (rating INTEGER) 
INSERT INTO @employeestable 
SELECT NULL 
UNION ALL SELECT 99 

DECLARE @filter INTEGER 
SET @filter = 3 

SQL語句

SELECT * 
FROM (
      SELECT Filter = CASE WHEN rating IS NULL THEN 2 ELSE 1 END 
        , * 
      FROM @employeestable 
     ) et 
WHERE et.Filter & @filter = et.filter 
2

由70%降低你的代碼是好的,但使用的指標是使查詢表現良好的唯一途徑。閱讀這篇文章:Dynamic Search Conditions in T-SQL by Erland Sommarskog,。動態搜索條件有很多種方式,每種方式都有自己的微妙性能折衷。如果您擔心多次重複查詢的大部分內容,請考慮將其替換爲視圖。

+0

+1會說同樣的事情。較少的代碼並不一定意味着更高性能的代碼。 – AdaTheDev 2010-05-11 12:40:50

+1

當你損害整齊的SQL代碼的性能時,你經常會壓抑性能,超出你的想象。 – 2010-05-11 12:45:52