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 条款,但这是最低限度的损害。
搜索列和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 条款,但这是最低限度的损害。