[英]SQL Server stored procedure to search list of values without special characters
在忽略特殊字符的同时,搜索列并返回所有匹配值的最有效方法是什么?
例如,如果一个表的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引擎上运行的功能索引?
您可以使用计算列并将其编入索引:
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');
当然,您的替换语句将更复杂,您必须以与清理列值相同的方式清理用户输入。 但这将是最有效的方法。
但说实话,我只是创建一个单独的列来存储用于查询目的的清理值并保留显示的实际值。 您将需要处理额外的更新/插入条款,但这是最小的损害。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.