好的,第无数个条件列问题:
我正在编写一个存储过程,它接受一个映射到几个标志列之一的输入参数。过滤请求列的最佳方法是什么?我目前正在使用 SQL2000,但即将转移到 SQL2008,因此如果有可用的解决方案,我将采用现代解决方案。
在存储过程中查询的表看起来像
ID ... fooFlag barFlag bazFlag quuxFlag
-- ------- ------- ------- --------
01 1 0 0 1
02 0 1 0 0
03 0 0 1 1
04 1 0 0 0
我想做类似的事情
select ID, name, description, ...
from myTable
where (colname like @flag + 'Flag') = 1
因此,如果我像调用 sproc 一样exec uspMyProc @flag = 'foo'
返回第 1 行和第 4 行。
我知道我不能直接在 SQL 中做括号中的部分。为了执行动态 SQL,我必须将整个查询填充到一个字符串中,连接 WHERE 子句中的 @flag 参数,然后执行该字符串。除了我在执行动态 SQL 时得到的肮脏感觉之外,我的查询相当大(我选择了几十个字段,连接 5 个表,调用了几个函数),所以它是一个很大的字符串,都是因为一行在 3 行 WHERE 过滤器中。
或者,我可以有 4 个查询副本,并在 CASE 语句中选择它们。这使得 SQL 代码可以直接执行(并受制于语法高亮等),但代价是重复大块代码,因为我不能只在 WHERE 子句上使用 CASE。
还有其他选择吗?可以应用任何棘手的连接或逻辑操作吗?还是我应该克服它并执行动态 SQL?