首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server LIKE 模糊查詢完全指南:萬用字元、效能陷阱與最佳實踐

     編輯:關於SqlServer

四大萬用字元語法

萬用字元含義範例匹配範例
%零或多個任意字元LIKE 'Mc%'McBadden, Mc, McDonald
_單一任意字元LIKE '_heryl'Cheryl, Sheryl
[範圍]指定範圍/集合內單一字元LIKE '[CK]ars[eo]n'Carsen, Karsen, Carson, Karson
[^範圍]不在指定範圍/集合內單一字元LIKE 'M[^c]%'MacFeather (非 Mc...)

常用模式速查

  • LIKE '415%':以 415 開頭(電話區碼)
  • LIKE '%inger':以 inger 結尾
  • LIKE '%en%':包含 en(中間匹配)
  • LIKE '[M-Z]inger':M-Z 開頭 + inger 結尾
  • NOT LIKE '415%' / WHERE NOT phone LIKE '415%':排除模式

關鍵效能法則:前導萬用字元殺死索引

-- 無法使用索引(全表掃描)
WHERE name LIKE '%mith'

-- 可使用索引(範圍掃描)
WHERE name LIKE 'Smith%'
WHERE name LIKE 'Samue%'

原理:B-tree 索引依前綴排序。前導 % 如同電話簿找「%mith」——無法定位起始頁。中間或尾部 % 不影響索引搜尋定位。

搜尋字面萬用字元

方法 1:ESCAPE 關鍵字

WHERE ColumnA LIKE '%5/%%' ESCAPE '/'  -- 找含 5% 的字串

/ 後的 % 視為字面字元。

方法 2:方括號包裹

WHERE ColumnA LIKE '9[-]5'  -- 找 9-5,非範圍
WHERE ColumnA LIKE '5[%]'   -- 找 5%
WHERE ColumnA LIKE '[_]n'   -- 找 _n

尾隨空格語意差異

  • WHERE col LIKE 'abc ':不匹配 'abc'(模式含空格)
  • WHERE col LIKE 'abc':匹配 'abc'、'abc '、'abc '(忽略資料尾隨空格)

資料尾隨空格在 LIKE 比較中被忽略,但模式尾隨空格卻有意義。

文字欄位限制

text/ntext/image(已淘汰)僅支援 LIKE、IS NULL、PATINDEX。現代請用 VARCHAR(MAX)/NVARCHAR(MAX)。

排序規則影響

LIKE 結果依資料庫/欄位排序規則:大小寫敏感、重音敏感、寬度敏感。測試時請確認 COLLATION 設定。

效能優化建議

  1. 避免前導 %:全文檢索、字首索引、計算欄位反轉
  2. 使用計算欄位 + 索引:REVERSE(name) 索引支援尾部搜尋
  3. 全文檢索:CONTAINS/FREETEXT 適用大量文字搜尋
  4. 字首搜尋優化:WHERE name >= 'Smith' AND name < 'Smiti' 替代 LIKE 'Smith%'
  5. 統計資料維護:確保基數估算準確

實務範例:客戶搜尋優化

-- 原始:前導 % 無法用索引
SELECT * FROM Customers WHERE Name LIKE '%' + @Keyword + '%'

-- 優化 1:若為字首搜尋
SELECT * FROM Customers WHERE Name LIKE @Keyword + '%'

-- 優化 2:全文檢索
CREATE FULLTEXT INDEX ON Customers(Name) KEY INDEX PK_Customers
SELECT * FROM Customers WHERE CONTAINS(Name, @Keyword)

-- 優化 3:計算欄位反轉索引(支援尾部搜尋)
ALTER TABLE Customers ADD RevName AS REVERSE(Name)
CREATE INDEX IX_Customers_RevName ON Customers(RevName)
SELECT * FROM Customers WHERE RevName LIKE REVERSE(@Keyword) + '%'
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved