删除特殊字符的搜索字符串数据

Gad*_*ski -1 sql-server sql-server-2016 string-searching

我们有一张包含约 600 万种产品的表:

ID 姓名 代码
1 123.456.789-M
2 852.789456
3 1-123654.P

按代码列过滤产品而没有掩码(痕迹、斜线或点)的好方法(关于性能)是什么?

例子:

SELECT id, name FROM products WHERE code = '123456789M' OR code = '1123654P';
Run Code Online (Sandbox Code Playgroud)

小智 5

使用索引计算列:

CREATE TABLE dbo.Products
(
    ID integer NOT NULL UNIQUE CLUSTERED,
    [Name] varchar(10) NOT NULL PRIMARY KEY NONCLUSTERED,
    Code varchar(20) NOT NULL,
    SearchCode AS 
        ISNULL(
            CONVERT(varchar(20), 
                REPLACE(
                    REPLACE(Code, '-', ''), 
                    '.', '')
                ), 
            ''),
    
    INDEX [IX dbo.Products SearchCode (Name)] 
        (SearchCode) 
        INCLUDE ([Name])
);

INSERT dbo.Products
    (ID, [Name], Code)
VALUES
    (1, 'One', '123.456.789-M'),
    (2, 'Two', '852.789456'),
    (3, 'Three', '1-123654.P');
Run Code Online (Sandbox Code Playgroud)
SELECT P.ID, P.[Name]
FROM dbo.Products AS P
WHERE P.SearchCode = '123456789M';
Run Code Online (Sandbox Code Playgroud)
ID 姓名
1

计划

db<>fiddle 在线演示