SQL 用于搜索不带特殊字符的值列表的服务器存储过程

SQL Server stored procedure to search list of values without special characters

搜索列和return所有匹配值同时忽略特殊字符的最有效方法是什么?

例如,如果 table 的 part_number 列具有以下值 '10-01' '14-02-65' '345-23423' 并且用户搜索 '10_01'140265 它应该 return '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 服务器引擎上运行的功能索引?

您可以使用 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');

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

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

但老实说,我只是创建一个单独的列来存储清理后的值以供查询,并保留实际值以供显示。您必须注意额外的 update/insert 条款,但这是最低限度的损害。