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 |
-- 查找實際包含 '50%' 的字串
WHERE column LIKE '%50\%%' ESCAPE '\';
-- 查找實際包含 '_' 的字串
WHERE column LIKE '%\_%' ESCAPE '\';
escape_character 單一字元,無預設值。
| 場景 | 資料類型 | 模式 | 結果 | 原因 |
|---|---|---|---|---|
| char(30) 儲存 'Robert King' | char (非 Unicode) | LIKE '% King' | ✅ 1 列 | char 右側填空格,但尾隨空格在非 Unicode 比對中**無意義** |
| nchar(30) 儲存 'Robert King' | nchar (Unicode) | LIKE '% King' | ❌ 0 列 | nchar 右側填空格,尾隨空格在 Unicode 比對中**有意義** |
| nchar(30) + RTRIM | nchar | RTRIM(col) LIKE '% King' | ✅ 1 列 | 移除尾隨空格後比對 |
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 總是掃描。
-- 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 比對細節與索引利用條件,能寫出正確且高效的模糊查詢。