在where子句中切换case

时间:2010-05-11 12:28:32

标签: sql-server-2005 sql-server-2008

我需要检查三个条件:

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%
请现在告诉我,我该怎么办呢。

3 个答案:

答案 0 :(得分:6)

这个怎么样?

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

答案 1 :(得分:2)

将代码减少70%很不错,但使用索引是使查询运行良好的唯一方法。阅读这篇文章:Dynamic Search Conditions in T-SQL by Erland Sommarskog,。有许多方法可以获得动态搜索条件,每种方式都有自己的微妙性能折衷。如果您担心多次重复查询的大部分内容,请考虑将其替换为视图。

答案 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