在 LIKE 模式比對中,%(任意長度字串)與 _(單一字元)為萬用字元。若需查詢實際包含這些字元的資料,必須使用 ESCAPE 子句指定轉義字元。
WHERE column LIKE 'pattern' ESCAPE 'escape_character'
\(反斜線)-- 資料:'aa_a', 'aaa'
SELECT * FROM t11 WHERE name LIKE '%_%';
-- 結果:aa_a, aaa (_ 被視為萬用字元,匹配任意單一字元)
SELECT * FROM t11 WHERE name LIKE '%\_%' ESCAPE '\';
-- 結果:aa_a (\_ 代表實際底線字元)
-- 若搜尋包含 '//' 的字串,需用 '/' 自身作為轉義字元
SELECT * FROM wan_test WHERE psid LIKE '%//%' ESCAPE '/';
若搜尋字元為/,轉義字元也必須用/;同理,若搜尋\,轉義字元用\。
| 要搜尋的實際字元 | LIKE 模式寫法 | ESCAPE 字元 |
|---|---|---|
| % | \% | \ |
| _ | \_ | \ |
| \ | \\ | \ |
| / | // | / |
| @ | \@ | \ |
-- PL/SQL 函數:自動轉義使用者輸入的關鍵字
CREATE OR REPLACE FUNCTION escape_like(p_str IN VARCHAR2, p_esc IN VARCHAR2 DEFAULT '\')
RETURN VARCHAR2 IS
BEGIN
RETURN REPLACE(REPLACE(REPLACE(p_str, p_esc, p_esc||p_esc), '%', p_esc||'%'), '_', p_esc||'_');
END;
/
使用方式:
SELECT * FROM products
WHERE name LIKE '%' || escape_like(:user_input) || '%' ESCAPE '\';
ESCAPE 字元只能是單一字元\\ 代表實際反斜線)ESCAPE 子句為 Oracle 擴充,符合 SQL 標準掌握 ESCAPE 機制,能精準處理含特殊字元的模糊查詢,避免資料遺漏或誤判。