11

我需要根据 nvarchar(1000) 列中的一些文本匹配过滤掉记录。表有超过 40 万条记录并且还在增长。现在,我正在使用 Like 条件:-

SELECT 
    *
FROM
    table_01
WHERE
    Text like '%A1%'
    OR Text like '%B1%'
    OR Text like '%C1%'
    OR Text like '%D1%'

有没有首选的工作?

4

5 回答 5

8
SELECT 
    *
FROM
    table_01
WHERE
    Text like '%[A-Z]1%'

这将检查文本是否包含 A1、B1、C1、D1、...

在 SQL Server中使用 Like 条件的参考

于 2011-01-31T20:40:39.377 回答
6

如果您知道子字符串的确切位置,可以尝试以下操作:

SELECT 
    *
FROM
    table_01
WHERE
    SUBSTRING(Text,1,2) in ('B1','C1','D1')
于 2012-10-20T06:30:21.470 回答
4

看看msdn上的LIKE

您可以通过将更多详细信息组合到单个LIKE子句中来减少过滤器数量。

SELECT 
    *
FROM
    table_01
WHERE
    Text like '%[ABCD]1%'
于 2011-01-31T20:42:12.993 回答
0

如果您可以FULLTEXT INDEX在表格的该列上创建一个(假设对性能和空间进行了大量研究),那么您可能会看到文本匹配性能的巨大改进。你可以去这个链接看看是什么FULLTEXT SEARCH,这个链接看看如何创建一个FULLTEXT INDEX.

于 2011-01-31T20:39:47.940 回答
0

我需要这样做,以便我可以DatabaseName在 SQL Server Profiler 跟踪模板中的列的筛选器中允许两个不同的数据库。

您所能做的就是填写Like子句的正文。

使用John Hartscock 的回答中的参考资料,我发现 like 子句使用了一种有限的正则表达式模式。

对于 OP 的场景,MSMS 有解决方案

假设我想要数据库 ABCOne、ABCTwo 和 ABCThree,我想出了每个字符本质上独立的白名单:

Like ABC[OTT][NWH][EOR]%

这很容易扩展到任何字符串集。它不会是铁定的,最后一个模式也将匹配 ABCOwe、ABCTnr 或 ABCOneHippotamus,但如果您过滤一组有限的可能值,则很有可能使其工作。

您也可以使用[^]运算符显示不可接受字符的黑名单。

于 2014-10-22T22:42:41.390 回答