我有一个名为Student的表,其中有很多外键用于过滤学生(表行)。
该表的结构如下:
StudentId GenderId DegreeId NatioanlityId
1 2 2 3
....
由于学生可以说一种或多种语言,因此Sudent Table会链接到这样的语言表
StudentId LangaugeId
1 1
1 2
1 3
学生可以选择一门或多门科目进行考试:
StudentId ExamId
1 1
1 2
....
在我的asp.net页面中,我想通过复选框使用ajax过滤学生 例如,学生的男女性别与学位1,说话语言1,2 ...我使用用户定义的表过滤存储过程中的行,我必须使用很多这样的IF语句 if(EXISTS(SELECT GenderId FROM @GenderTable))
if(EXISTS(SELECT DegreeId FROM @DegreeTable))
if(....)
else
if(...)
如何避免所有IF语句?我有超过5个过滤器。这很无聊。有人有什么想法吗?
提前致谢。
答案 0 :(得分:1)
我假设您的查询返回符合条件的学生列表?如果是这样,一种方法是按照这种格式构建一个where子句
Where
(@Param1 IS NULL OR Field1 = @Param1)
AND (@Param2 IS NULL OR Field2 = @Param2)
这可能会变得很难看,并且可能效果不佳,具体取决于可能使用的过滤器数量以及索引的构建方式。
另一种选择是使用动态SQL。您可以在.net代码或SQL存储过程中生成它。基本上结束了以下的事情:
Set @Query = /* base select statement */
If @Param1 IS NOT NULL
Set @Query = @Query + 'AND Field1 = @Param1'
If @Param2 IS NOT NULL
Set @Query = @Query + 'AND Field2 = @Param2'
Exec sp_executesql @Query, @ParamList, @Param1, @Param2
这可能会更难以阅读和调试,但它通常会更好地执行,因为您只查看实际被过滤的字段。但是,如果使用动态SQL,则需要注意一些关键点,注入攻击位于列表的顶部。 http://www.sommarskog.se/dynamic_sql.html是动态SQL应该和不应该做什么的好资源。