2

我正在使用一个存储过程,该过程提取一个字符串参数并将其用作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]-%"但是我还没有找到解释最终可能值的好方法。有没有好的方法,或者我需要用逻辑使存储过程复杂化来处理这种情况?

4

3 回答 3

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%";
于 2013-03-18T19:50:36.183 回答
0

我问了一个类似的问题:

TSQL - 使用 Like 进行模式匹配

并且有一些很好的答案。我认为最能帮助您的方法是将您可能的模式放入一个新表中,然后按照 MaxiWheat 的建议加入这些表。

于 2013-04-02T01:49:46.267 回答
0

select ... from ...
where [value] like "RBI-%-TH%N-[ABCD]-%" or [value] like "RBI-%-VISUAL%"

不够?

于 2013-03-18T18:44:54.350 回答