簡體   English   中英

SQL Server存儲過程搜索沒有特殊字符的值列表

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM