我正在使用一个存储过程,它引入一个字符串参数,并将其作为WHERE table.value LIKE @pattern
子句的一部分用于其中一个查询。在任何人对我调用的危险进行抨击之前,使用一组已知值作为模式参数调用该过程 - 用户输入没有直接传递给此参数。
对于个别情况,这是有效的。我可能的模式是:
"RBI-%-TH%N-[AB]-%"
"RBI-%-TH%N-C-%"
"RBI-%-TH%N-D-%"
"RBI-%-VISUAL%"
我遇到问题的方法是尝试通过设置默认模式来覆盖所有这四个模式(这将选择table.value
匹配任何这些模式的所有记录,但没有别的)。前三个对"RBI-%-TH%N-[ABCD]-%"
很容易,但是我无法找到一个好的方法来考虑最终的可能值。有没有好方法,或者我是否需要使用逻辑来复杂存储过程来处理这种情况?
答案 0 :(得分:0)
是
select ... from ...
where [value] like "RBI-%-TH%N-[ABCD]-%" or [value] like "RBI-%-VISUAL%"
还不够吗?
答案 1 :(得分:0)
以下是使用UNION ALL的另一个变体,根据基数可能会导致更有限的范围扫描,但无论您如何构建查询,都有可能进行一些长时间运行的扫描。您必须测试一些变体并查看执行计划,以了解在针对您的数据运行时性能如何实际堆叠。设置并使用自由文本搜索选项吗?
SELECT ...
FROM ...
WHERE [value] like "RBI-%-TH%N-[A]-%"
UNION ALL
SELECT ...
FROM ...
WHERE [value] like "RBI-%-TH%N-[B]-%"
UNION ALL
SELECT ...
FROM ...
WHERE [value] like "RBI-%-TH%N-[C]-%"
UNION ALL
SELECT ...
FROM ...
WHERE [value] like "RBI-%-TH%N-[D]-%"
UNION ALL
SELECT ...
FROM ...
WHERE [value] like "RBI-%-VISUAL%";
答案 2 :(得分:0)
我问了一个类似的问题:
TSQL - Pattern Matching with Like
并且有一些很好的答案。我认为最能帮助你的是将你可能的模式放到一个新表中,然后按照MaxiWheat的建议加入表格。