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