SQL Server 存储过程来搜索不带特殊字符的值列表

Posted

技术标签:

【中文标题】SQL Server 存储过程来搜索不带特殊字符的值列表【英文标题】:SQL Server stored procedure to search list of values without special characters 【发布时间】:2017-05-18 12:54:14 【问题描述】:

在忽略特殊字符的情况下搜索列并返回所有匹配值的最有效方法是什么?

例如,如果一个表的 part_number 列具有以下值 '10-01' '14-02-65' '345-23423',并且用户搜索 '10_01'140265,它应该返回 '10-01''14-02-65'

使用正则表达式处理输入以删除这些字符是可能的,因此可以向存储过程传递参数'1001 140265',然后它可以拆分该输入以形成类似的 SQL 语句

SELECT *
FROM MyTable
WHERE part_number IN ('1001', '140265')

这里的问题是这不会匹配任何东西。在这种情况下,以下将起作用

SELECT *
FROM MyTable
WHERE REPLACE(part_number,'-','') IN ('1001', '140265')

但我需要删除所有特殊字符。或者至少所有这些字符 ~!@#$%^&*()_+?/\[]; 替换每个字符,当 IN 子句中的部分数量少于 200 时,查询需要几分钟。

通过创建一个执行替换的函数来提高性能,因此查询时间不到一分钟。但是如果不删除,查询大约需要 1 秒,有没有办法创建某种可以在多个 SQL Server 引擎上工作的功能索引?

【问题讨论】:

【参考方案1】:

您可以使用 computed column 并将其编入索引:

CREATE TABLE MyTable (
    part_number VARCHAR(10) NOT NULL,
    part_number_int AS CAST(replace(part_number, '-', '') AS int)
    );
ALTER TABLE dbo.MyTable ADD PRIMARY KEY (part_number);
ALTER TABLE dbo.MyTable ADD UNIQUE (part_number_int);

INSERT INTO dbo.MyTable (part_number)
VALUES ('100-1'), ('140265');

SELECT *
FROM dbo.MyTable AS MT
WHERE MT.part_number_int IN ('1001', '140265');

当然,您的替换语句会更复杂,您必须像清理列值一样清理用户输入。但这将是最有效的方法。

此查询现在可以有效地查找您的列:

但老实说,我只是创建一个单独的列来存储清理后的值以用于查询目的,并保留实际值以供显示。您必须注意额外的更新/插入子句,但这是最低限度的损害。

【讨论】:

以上是关于SQL Server 存储过程来搜索不带特殊字符的值列表的主要内容,如果未能解决你的问题,请参考以下文章

Java调用SQL Server的存储过程详解(转)

SQL Server 使用全文索引进行页面搜索

SQL Server 如何执行 带参数的 存储过程

使用 CONTAINSTABLE 在 SQL Server 全文搜索查询中转义 & 号

SQL Server 全文索引介绍(转载)

在 SQL Server 表中存储一些特殊字符