熟練掌握 LIKE 萬用字元,能以簡潔語法解決複雜字串比對需求。本文涵蓋四大萬用字元(%、_、[]、[^])與 PATINDEX 進階應用實例。
| 符號 | 意義 | 範例 |
|---|---|---|
% | 任意長度(含 0)字串 | 'ABC%' 以 ABC 開頭 |
_ | 單一任意字元 | '_an' 以 an 結尾的三字元 |
[範圍] | 單一字元落於指定集合 | '[0-9][0-9][0-9][0-9]' 四位數字郵遞區號 |
[^範圍] | 單一字元**不在**指定集合 | 'Al[^a]%' 以 Al 開頭且第三字元非 a |
_:固定長度模式SELECT FirstName, LastName
FROM Person.Person
WHERE FirstName LIKE '_an'
ORDER BY FirstName;
找出三字母、以 "an" 結尾的名字(如 Dan, Jan, Nan)。
[^]:否定集合SELECT FirstName, LastName
FROM Person.Person
WHERE FirstName LIKE 'Al[^a]%'
ORDER BY FirstName;
找出以 "Al" 開頭、第三字母**不是** "a" 的名字(排除 Alan, Alana 等)。
[]:郵遞區號驗證SELECT e.BusinessEntityID, p.FirstName, p.LastName, a.PostalCode
FROM HumanResources.Employee e
JOIN Person.Person p ON e.BusinessEntityID = p.BusinessEntityID
JOIN Person.BusinessEntityAddress bea ON e.BusinessEntityID = bea.BusinessEntityID
JOIN Person.Address a ON a.AddressID = bea.AddressID
WHERE a.PostalCode LIKE '[0-9][0-9][0-9][0-9]';
篩選四位數字郵遞區號的員工。結果範例:290 Lynn Tsoflias 3000。
利用 PATINDEX 偵測字元範圍,分類純英文、純中文、混合:
CREATE TABLE #tb (name NVARCHAR(20));
INSERT INTO #tb VALUES ('kevin'), ('kevin劉'), ('劉');
SELECT *, 'Eng' AS Type FROM #tb
WHERE PATINDEX('%[a-z]%', name) > 0 AND PATINDEX('%[吖-坐]%', name) = 0
UNION ALL
SELECT *, 'CN' FROM #tb
WHERE PATINDEX('%[吖-坐]%', name) > 0 AND PATINDEX('%[a-z]%', name) = 0
UNION ALL
SELECT *, 'Eng&CN' FROM #tb
WHERE PATINDEX('%[吖-坐]%', name) > 0 AND PATINDEX('%[a-z]%', name) > 0;
結果:kevin=Eng、劉=CN、kevin劉=Eng&CN。
註:[吖-坐] 為常見中文字元範圍近似,實務建議使用 N'' 前綴與資料庫定序配合,或改用 LIKE N'%[一-龥]%'(需定序支援)。
LIKE '%pattern%' 開頭萬用字元**無法使用索引搜尋**(Index Seek),會掃描全表。LIKE 'prefix%' 可用索引。