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

SQL Server LIKE 謂詞完整解析:通配符、跳脫字元、Unicode/ASCII 模式與效能陷阱

     編輯:關於SqlServer

LIKE 是 T-SQL 中進行模式比對的核心運算子,支援通配符、字元範圍、跳脫字元,並區分 ASCII/Unicode 模式比對行為。本文系統整理語法、四大通配符、實戰範例與常見陷阱。

語法


match_expression [ NOT ] LIKE pattern [ ESCAPE escape_character ]

四大通配符

符號說明範例匹配結果
%零或多個任意字元WHERE title LIKE '%computer%'書名任意位置含 "computer"
_ (底線)單一任意字元WHERE au_fname LIKE '_ean'4 字母且以 "ean" 結尾 (Dean, Sean)
[範圍/集合]指定範圍或集合內的單一字元WHERE au_lname LIKE '[C-P]arsen'以 arsen 結尾,首字母 C-P 間 (Carsen, Larsen...)
[^範圍/集合]不在指定範圍/集合內的單一字元WHERE au_lname LIKE 'de[^l]%'以 de 開頭,第三字元非 l

跳脫字元 ESCAPE


-- 查找實際包含 '50%' 的字串
WHERE column LIKE '%50\%%' ESCAPE '\';
-- 查找實際包含 '_' 的字串
WHERE column LIKE '%\_%' ESCAPE '\';

escape_character 單一字元,無預設值。

ASCII vs Unicode 模式比對差異 (關鍵陷阱)

場景資料類型模式結果原因
char(30) 儲存 'Robert King'char (非 Unicode)LIKE '% King'✅ 1 列char 右側填空格,但尾隨空格在非 Unicode 比對中**無意義**
nchar(30) 儲存 'Robert King'nchar (Unicode)LIKE '% King'❌ 0 列nchar 右側填空格,尾隨空格在 Unicode 比對中**有意義**
nchar(30) + RTRIMncharRTRIM(col) LIKE '% King'✅ 1 列移除尾隨空格後比對

規則總結

  • 所有參數均為 ASCII 類型 → ASCII 模式比對 (尾隨空格無意義)。
  • 任一參數為 Unicode 類型 → 全部轉 Unicode 比對 (尾隨空格有意義)。
  • CHAR/VARCHAR 變數傳入預存程序時,若長度大於實際資料,CHAR 會保留尾隨空格導致比對失敗,**建議統一使用 VARCHAR/NVARCHAR 參數**並配合 `RTRIM`。

日期時間欄位比對建議

對 `DATETIME` 欄位比對時間部分,建議用 `LIKE` 而非 `=`:


-- 錯誤:WHERE ArrivalTime = '9:20'  -- 會被轉為 1900-01-01 09:20
-- 正確:
WHERE ArrivalTime LIKE '%9:20%';

效能考量

  • LIKE 'prefix%' (前綴固定) → **可用索引 Seek**。
  • LIKE '%suffix' 或 LIKE '%middle%' → **全表掃描**,大表效能差。
  • NOT LIKE 總是掃描。
  • 大量模糊搜尋需求 → 考慮 Full-Text Search 或 Elasticsearch 等專用引擎。

實用範例集


-- 1. 所有系統表
SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE 'sys%';

-- 2. 排除系統表
SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME NOT LIKE 'sys%';

-- 3. 反向通配符陷阱:LIKE '[^s][^y][^s]%' 不等同 NOT LIKE 'sys%'
--    逐字元過濾會誤除以 s/y/s 開頭的非系統表

-- 4. 參數化查詢 (安全)
DECLARE @pattern NVARCHAR(50) = N'%computer%';
SELECT * FROM Products WHERE Name LIKE @pattern;

精通 LIKE 的通配符語義、Unicode 比對細節與索引利用條件,能寫出正確且高效的模糊查詢。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved