我的网站上有一个页面,其中有多个下拉框作为过滤器。
因此该页面的SQL过程将是这样的
IF @Filter1 = 0, @Filter2 = 0, @Filter3 = 0
BEGIN
SELECT * FROM Table1
END
ELSE IF @Filter1 = 1, @Filter2 = 0, @Filter3 = 0
BEGIN
SELECT * FROM Table2
END
一开始,每个过滤器只有几个结果,所以没有那么多的排列。但是,添加了更多过滤器,现在有超过20个IF ELSE检查。
因此,如果每个过滤器有5个选项,我将需要进行5 * 5 * 5 = 125 IF ELSE检查以返回依赖于过滤器的数据。
更新 第一个过滤器改变WHERE条件,第二个过滤器向结果集添加更多表,第三个过滤器改变ORDER BY条件
如何使这个查询更具可伸缩性,除了使用动态SQL之外,每次将新的过滤器添加到列表时,我不必编写一堆新的IF ELSE语句来检查每个条件...
答案 0 :(得分:1)
你必须有一个带有公式的规则表,可能是按位,并构造一个可能从表中插入变量数据的查询,并附加到一个字符串以形成sql并使用动态sql来运行它们。
答案 1 :(得分:0)
尽管我不喜欢动态SQL,但这可能是它的时间。您可以一次构建一个查询,然后在最后执行它。
如果您不熟悉,语法如下:
DECLARE @SQL VARCHAR(1000)
SELECT @SQL = 'SELECT * FROM ' + 'SOME_TABLE'
EXEC(@SQL)
确保处理SQL注入攻击,适当的间距等。
在这种情况下,我会尽力将此逻辑放在应用程序代码中,但这并不总是可行的。如果您正在使用LINQ-to-SQL或其他LINQ框架,那么您应该能够安全地执行此操作,但可能需要一些创造力才能正确构建LINQ查询。
答案 2 :(得分:0)
您可以设置一组视图,每个“过滤器”一个,然后根据选择的“过滤器”从相应的视图中进行选择。