今天项目碰到一个问题,关于sql模糊查询的通配和转义,在网上查一些资料,整理一下
- 通配符 说明
_ 与任意单字符匹配
% 与包含一个或多个字符的字符串匹配
[ ] 与特定范围(例如,[a-f])或特定集(例如,[abcdef])中的任意单字符匹配。
[^] 与特定范围(例如,[^a-f])或特定集(例如,[^abcdef])之外的任意单字符匹配。
例子:
• WHERE FirstName LIKE '_im' 可以找到所有三个字母的、以 im 结尾的名字(例如,Jim、Tim)。
• WHERE LastName LIKE '%stein' 可以找到姓以 stein 结尾的所有员工。
• WHERE LastName LIKE '%stein%' 可以找到姓中任意位置包括 stein 的所有员工。
• WHERE FirstName LIKE '[JT]im' 可以找到三个字母的、以 im 结尾并以 J 或 T 开始的名字(即仅有Jim 和Tim)
• WHERE LastName LIKE 'm[^c]%' 可以找到以 m 开始的、后面的(第二个)字母不为 c 的所有姓。
2. ESCAPE 'escape_character'
允许在字符串中搜索通配符而不是将其作为通配符使用。escape_character 是放在通配符前表示此特殊用途的字
符。
SELECT *
FROM finances
WHERE description LIKE 'g!_' ESCAPE '!' GO
意思就是:
比如,我们要搜索一个字符串 "g_" ,如果直接 like "g_",那么 "_"的作用就是通配符,而不是字符,结果,我们
会查到比如 "ga","gb","gc",而不是我们需要的 "g_".
用 LIKE 'g!_' ESCAPE '!' '!'表示特殊用法标志,注意!可以被任意字符替代,只是不能是系统中允许出现的
字符,否则又要转义了……
3. replace 该派上用场了
其实看着 ESCAPE 用法感觉还是很不爽,至少对我现在的需求如此。为什么不能直接转移 _ % 等字符么,非要
ESCAPE 一下 _ % 的前一个字符!因为我根本不知道用户输入的查询条件中 _ % 前一个字符是什么,所以必须要
replace 一下 T_T
SELECT t.*, t.ROWID
FROM table1 t
WHERE t.col1 LIKE REPLACE(lower(#col1#), '%', '\%')) || '%' ESCAPE '\';