2010-05-11 159 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