需求:同一查詢需同時支持「包含下劃線的精確匹配」和「普通模糊匹配」。下劃線 `_` 在 `LIKE` 中是單字符通配符,需轉義;但若用戶輸入不含下劃線,應退化為普通 `%keyword%`。
-- 僅匹配含下劃線的
SELECT * FROM table_name t WHERE t.name LIKE '%\_%' ESCAPE '\'
-- 無法匹配不含下劃線的關鍵詞
-- 偽代碼
IF (keyword LIKE '%_%') THEN -- 含下劃線
sql = "SELECT * FROM t WHERE name LIKE ? ESCAPE '\'";
param = keyword.replace("_", "\_").replace("%", "\%"); -- 轉義
ELSE
sql = "SELECT * FROM t WHERE name LIKE ?";
param = "%" + keyword + "%";
END IF;
EXECUTE sql USING param;
IF flag THEN
V_PRO := 'SELECT * FROM table_name t WHERE t.name LIKE ''%\_%'' ESCAPE ''\''';
ELSE
V_PRO := 'SELECT * FROM table_name t WHERE t.name LIKE ''%' || keyword || '%''';
END IF;
EXECUTE IMMEDIATE V_PRO;
SELECT * FROM table_name
WHERE
(keyword LIKE '%\_%' ESCAPE '\' AND name LIKE keyword ESCAPE '\')
OR (keyword NOT LIKE '%\_%' ESCAPE '\' AND name LIKE CONCAT('%', keyword, '%'));
-- 注意:keyword 為參數,需應用層注入或預處理
單條靜態 SQL 難以同時優雅處理「轉義下劃線」與「普通模糊」。推薦應用層根據輸入特徵動態選擇查詢模式並參數化執行。