| 符號 | 含義 | 示例 | 匹配結果示例 |
|---|---|---|---|
% | 任意長度字符串(含0長度) | WHERE name LIKE '%三%' | 張三、張貓三、三腳貓、唐三藏 |
_ | 單個任意字符 | WHERE name LIKE '_三_' | 唐三藏(3字、中間是三) |
[范圍] | 字符集合中任一字符 | WHERE name LIKE '[張李王]三' | 張三、李三、王三 |
[^范圍] | 非字符集合中任一字符 | WHERE name LIKE '[^張李王]三' | 趙三、孫三(非張/李/王) |
-- 同時包含"三"和"貓"(順序無關)
WHERE name LIKE '%三%' AND name LIKE '%貓%'
-- 以"三"開頭、以"貓"結尾、中間任意
WHERE name LIKE '三%貓%'
-- 精確3字、首字"三"
WHERE name LIKE '三__'
-- 問題:查詢字面值 "100%"、 "A_B"、 "[Test]"
-- 解決:使用 ESCAPE 子句自定義轉義字符(推薦 \)
WHERE code LIKE '100\%%' ESCAPE '\' -- 查 "100%"
WHERE code LIKE 'A\_B' ESCAPE '\' -- 查 "A_B"
WHERE code LIKE '\[Test\]' ESCAPE '\' -- 查 "[Test]"
-- 通用轉義函數 (PL/SQL)
CREATE OR REPLACE FUNCTION escape_like(p_str IN VARCHAR2, p_escape IN CHAR DEFAULT '\')
RETURN VARCHAR2 IS
BEGIN
RETURN REPLACE(REPLACE(REPLACE(p_str, p_escape, p_escape||p_escape), '%', p_escape||'%'), '_', p_escape||'_');
END;
/
-- 使用
WHERE name LIKE escape_like('100%') || '%' ESCAPE '\';
| 場景 | 問題 | 優化方案 |
|---|---|---|
前導% (%abc%) | 全表掃描,索引失效 | 1. Oracle Text/CTXSYS全文索引 2. 功能索引 CREATE INDEX idx ON tab(UPPER(name)) 配合 UPPER(name) LIKE '%ABC%'3. 將前導%改為後導% ( abc%) 利用B-tree索引 |
| 大表高頻模糊查詢 | CPU/IO壓力大 | 物化視圖預計算、結果集緩存、分區裁剪 |
| 中文全文檢索 | 字符語義切分 | Oracle Text配置中文詞典(CTXSYS.CHINESE_LEXER) |
-- 手機號格式
WHERE phone REGEXP_LIKE '^1[3-9]\d{9}$'
-- 郵箱簡易校驗
WHERE email REGEXP_LIKE '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$'
-- 多模式匹配 (等價於多個LIKE OR)
WHERE name REGEXP_LIKE '張|李|王'
col LIKE 'abc%') 利用索引範圍掃描。WHERE name LIKE :b1 (應用層構造 '%'+keyword+'%')。DBMS_STATS.GATHER_TABLE_STATS),優化器才能正確評估LIKE選擇率。SYS_CONTEXT或臨時表傳遞參數。版本差異提示:
•[范圍]/[^范圍]語法為SQL Server/Access風格,Oracle不原生支援。Oracle僅支援%/_/ESCAPE。
• Oracle 10g+ 引入REGEXP_LIKE/INSTR/SUBSTR/REPLACE正則函數族,功能遠超LIKE。
• 12c+JSON_EXISTS/JSON_VALUE支援半結構化模糊檢索。
• 本文原內容中的[]/[^]屬誤植,實際Oracle開發請使用REGEXP_LIKE或TRANSLATE實現字符集匹配。