模糊查詢是資料庫搜尋的基石。本文系統整理 LIKE 謓詞語法、四大萬用字元(%、_、[]、[^])、特殊字元逸出、跨資料庫差異與實戰範例,涵蓋 SQL Server、MySQL、Access。
SELECT column FROM table WHERE column LIKE pattern;
| 符號 | 名稱 | 匹配規則 | 範例 | 匹配結果 |
|---|---|---|---|---|
% | 百分號 | 任意 0 個或多個字元 | LIKE '%三%' | 張三、張貓三、三腳貓、唐三藏 |
_ | 底線 | 任意單一字元 | LIKE '_三_' | 唐三藏(三字、中間為三) |
[] | 字元集合 | 括號內任一字元(支援範圍 a-f、0-9) | LIKE '[張李王]三' | 張三、李三、王三 |
[^] | 排除字元集合 | 非括號內任一字元 | LIKE '[^張李王]三' | 趙三、孫三(非張/李/王) |
-- 1. 以 Mc 開頭
LIKE 'Mc%'
-- 2. 以 inger 結尾
LIKE '%inger'
-- 3. 任意位置包含 en
LIKE '%en%'
-- 4. 六字元、以 heryl 結尾
LIKE '_heryl'
-- 5. 正則風格:C/K 開頭、ars、e/o 結尾
LIKE '[CK]ars[eo]n' -- Carsen, Karsen, Carson, Karson
-- 6. M-Z 開頭、inger 結尾
LIKE '[M-Z]inger'
-- 7. M 開頭、第二字元非 c
LIKE 'M[^c]%'
若搜尋關鍵字本身包含 %、_、[,需將其視為字面字元。標準 SQL 使用 ESCAPE 子句:
-- 搜尋含 "100%" 的字串
SELECT * FROM products WHERE description LIKE '%100\%%' ESCAPE '\';
-- 搜尋含 "_" 的字串
SELECT * FROM products WHERE code LIKE '%\_%' ESCAPE '\';
Function SQLEncode(str)
str = Replace(str, "[", "[[]") ' 必須最先處理 [
str = Replace(str, "_", "[_]")
str = Replace(str, "%", "[%]")
SQLEncode = str
End Function
MySQL/PostgreSQL 亦支援 ESCAPE;Access 不支援 ESCAPE,需用 [] 包裹:LIKE '%[%]%'。
| 項目 | Access (ACE/Jet) | SQL Server / MySQL |
|---|---|---|
| 萬用字元 | * (多字元)、? (單字元) | %、_ |
| 字元集合 | 不支援 [] | 支援 []、[^] |
| 逸出機制 | 無 ESCAPE,用 [] 包裹 | 支援 ESCAPE '\' |
| 程式碼中寫法 | ADO/OLEDB 驅動程式會自動轉換 *→%、?→_ | 直接用 %、_ |
重要: 在應用程式中(PHP、Java、C#、Python)統一使用 ANSI SQL 萬用字元(%、_),驅動程式會根據目標資料庫轉換;僅在 Access 原生查詢視窗測試時才用 */?。
SELECT * FROM zipcode
WHERE address LIKE '%' + @keyword + '%'
OR city LIKE '%' + @keyword + '%'
OR province LIKE '%' + @keyword + '%'
ORDER BY province, city, address;
CREATE PROCEDURE SearchQuestions
@Keyword NVARCHAR(100),
@IsFinish BIT
AS
BEGIN
SELECT * FROM Questions
WHERE QTitle LIKE '%' + @Keyword + '%' -- 參數化防注入
AND IsFinish = @IsFinish;
END
LIKE 'keyword%'(前綴匹配)可使用索引(SARGable)。LIKE '%keyword' 或 LIKE '%keyword%' 導致全表掃描,大表效能差。FULLTEXT INDEX、SQL Server FULLTEXT CATALOG、PostgreSQL tsvector、Elasticsearch/OpenSearch。WHERE 中對欄位使用函數(LOWER(col) LIKE ...),改用 COLLATE 不分大小寫校對。SELECT * FROM user WHERE name REGEXP '^[A-Z][a-z]+$'; -- 正則匹配
-- MySQL 8.0 支援 REGEXP_REPLACE、REGEXP_SUBSTR、REGEXP_INSTR
掌握 LIKE 萬用字元與逸出規則,能精準實作關鍵字搜尋,並避免跨資料庫移植時的語法陷阱。