SQL Server存储过程搜索没有特殊字符的值列表

时间:2017-05-18 12:54:15

标签: sql sql-server stored-procedures stored-functions

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

例如,如果某个表的<chat-user :users-in-room="usersInRoom"></chat-user> 列具有以下值part_number且用户搜索'10-01' '14-02-65' '345-23423''10_01',则应返回140265并且'10-01'

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

'1001 140265'

这里的问题是这与任何事情都不匹配。在这种情况下,以下工作

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 个答案:

答案 0 :(得分:3)

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

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

此查询现在可以有效地搜索您的列:enter image description here

但说实话,我只是创建一个单独的列来存储用于查询目的的清理值并保留显示的实际值。你必须处理额外的更新/插入条款,但这是一个最小的伤害。