SQL优化where子句中的条件

时间:2013-09-22 15:19:49

标签: sql sql-server sql-server-2008 query-optimization where-clause

在asp中我设置了几个下拉菜单,允许用户根据他们的选择过滤掉页面上显示的数据。

这些下拉列表用于数据收集,一年级组,例如11年级,主题包括英语,教学组和小组。

必须全部选择数据收集,年份和主题,但教学组和子组可以保持未选中(全选),单独选择或同时选择。

由于子组下的许多选项,SQL存储过程中的where子句现在很大。下面是几个选项,其中没有选择子组或选择了女孩子组或选择了男孩子组。除此之外还有很多,但为了简洁起见,我限制了我发布的内容。

我的问题是,我可以以任何方式优化此代码,还是我最简洁?如果您需要更多示例,请告诉我,我会将它们添加到帖子中。

where 

--All
(@TeachingGroup = 'Select All' AND ([StuYear] = @StuYear) AND ([DataCollection] = @DataCollection) AND ([Name] = @SubjectName)  AND @Subgroup='Select All'
OR 
@TeachingGroup <> 'Select All' AND ([StuYear] = @StuYear) AND ([DataCollection] = @DataCollection) AND ([Name] = @SubjectName) AND ([TeachingGroup] = @TeachingGroup)  AND @Subgroup='Select All')
or
--Gender Girls
(@TeachingGroup = 'Select All' AND ([StuYear] = @StuYear) AND ([DataCollection] = @DataCollection) AND ([Name] = @SubjectName)  AND Gender = 
case when @Subgroup = 'GenF' then 'F' end)
OR 
@TeachingGroup <> 'Select All' AND ([StuYear] = @StuYear) AND ([DataCollection] = @DataCollection) AND ([Name] = @SubjectName) AND ([TeachingGroup] = @TeachingGroup)  AND Gender = case when @Subgroup = 'GenF' then 'F' end
or
--Gender boys
(@TeachingGroup = 'Select All' AND ([StuYear] = @StuYear) AND ([DataCollection] = @DataCollection) AND ([Name] = @SubjectName)  AND Gender = 
case when @Subgroup = 'GenM' then 'M' end)
OR 
@TeachingGroup <> 'Select All' AND ([StuYear] = @StuYear) AND ([DataCollection] = @DataCollection) AND ([Name] = @SubjectName) AND ([TeachingGroup] = @TeachingGroup)  AND Gender = case when @Subgroup = 'GenM' then 'M' end

1 个答案:

答案 0 :(得分:1)

如果您获得更多条件,您可能需要调查动态SQL,根据提供的内容构建不同的查询。

此外,将'Null'传递给'Select All'

是相当标准的做法

但是,这是你所拥有的更简单的版本:

Where
    [StuYear] = @StuYear And
    [DataCollection] = @DataCollection And
    [Name] = @SubjectName And (
        @TeachingGroup = 'Select All' Or 
        [TeachingGroup] = @TeachingGroup
    ) And (
       @SubGroup = 'Select All' Or
       Gender = Case 
               When @SubGroup = 'GenF' Then 'F'
               When @SubGroup = 'GenM' Then 'M'
           End
    )

动态sql示例

Declare 
    @params nvarchar(max) = '
@StuYear int,
@DataCollection varchar(30),
@SubjectName varchar(30),
@TeachingGroup varchar(30),
@SubGroup varchar(30)', --replace with your definitions
    @sql nvarchar(max) = '
Select 
    xxx 
from 
    xxx 
Where
    [StuYear] = @StuYear And
    [DataCollection] = @DataCollection And
    [Name] = @SubjectName'

If @TeachingGroup != 'Select All'
   Set @sql += ' And TeachingGroup = @TeachingGroup'

If @SubGroup != 'Select All'
   Set @sql += ' And Gender = Right(@SubGroup, 1)'

Exec sp_executesql @sql, @params, 
    @StuYear, @DataCollection, @SubjectName, @TeachingGroup, @SubGroup