模糊查询与通配符冲突
表结构描述:当前有一张表,此处假定node_info,存在一个字段node_path是由 ‘字母’、‘数字’ 及 ‘下划线_’组成,如:
abc_1_de_f。
需求:查询所有node_path以‘
abc_’开头的记录
这个问题,自然而然的就想到,很简单,直接like % 模糊匹配就OK:
- SELECT * FROM mode_info WHERE node_path LIKE 'abc_%'
那么,上面的需求该怎么实现呢。很简单:只要避免‘_’在此处作为通配符存在即可。如何避免呢,那就需要用到另外一个通配符'[]'。修改sql:
- SELECT * FROM mode_info WHERE node_path LIKE 'abc[_]%'
下面简单介绍下SQL通配符。
SQL通配符
通配符主要以下几种:
%、
_、
[]、
[^] 。
1. %:模糊匹配一个或多个字符。如,以ab开头
- SELECT * FROM (
- SELECT 'abc_2sd_38u' 'a'
- UNION ALL
- SELECT 'bcf' 'a'
- ) c
- WHERE c.a LIKE 'ab%'
a
-----------
abc_2sd_38u
2. _:占位符,匹配任意一个字符。如,以abc_开头
- SELECT * FROM (
- SELECT 'abc_2sd_38u' 'a'
- UNION ALL
- SELECT 'abcd_5d_3u' 'a'
- UNION ALL
- SELECT 'abc' 'a'
- ) c
- WHERE c.a LIKE 'abc[_]%'
-----------
abc_2sd_38u
3. []:目标匹配字符:匹配单个字符,若写了多个,匹配任一。如,所有以1或者2开头的
- SELECT * FROM (
- SELECT '1_21' 'a'
- UNION ALL
- SELECT '121' 'a'
- UNION ALL
- SELECT '131' 'a'
- UNION ALL
- SELECT '142' 'a'
- UNION ALL
- SELECT '223' 'a'
- UNION ALL
- SELECT '324' 'a'
- ) x
- WHERE x.a LIKE '[12]%'
-----------
1_21
121
131
142
223
4. [^]:目标匹配字符,[]相反。如,所有非1、2开头的
- SELECT * FROM (
- SELECT '1_21' 'a'
- UNION ALL
- SELECT '121' 'a'
- UNION ALL
- SELECT '131' 'a'
- UNION ALL
- SELECT '142' 'a'
- UNION ALL
- SELECT '223' 'a'
- UNION ALL
- SELECT '324' 'a'
- ) x
- WHERE x.a LIKE '[^12]%'
-----------
324