SQL通配符

来源:互联网 发布:网络thug life什么意思 编辑:程序博客网 时间:2024/05/17 03:15

前言

之所以想到记录通配符相关的内容,是因为前段时间与同事交流的时候,遇到一个模糊查询与通配符冲突而产生查询结果集错误的问题。。后来干脆梳理了与之相关的部分,也才有了下面的这篇文章。所以也很感谢交流这个问题的同事,要知道,每天那么忙,并不是所有的知识都有机会并值得抽时间去温习的。好了,闲话少说,开始正文。。。大笑

模糊查询与通配符冲突

表结构描述:当前有一张表,此处假定node_info,存在一个字段node_path是由 ‘字母’、‘数字’ 及 ‘下划线_’组成,如:abc_1_de_f
需求:查询所有node_path以‘abc_’开头的记录

这个问题,自然而然的就想到,很简单,直接like % 模糊匹配就OK: 
SELECT * FROM mode_info WHERE node_path LIKE 'abc_%'
运行,发现结果根本就不对,远远超过预期。不仅abc_开头的被查出来,abcd开头等等的也被查询命中。后来想了一下,突然记起'_'是通配符,也就是通常所说的占位符。而通配符大家都知道,会匹配所有单一字符。所以也就意味着,上面的那个sql,会匹配到所有node_path长度大于等于4,且以abc开头的所有记录。
那么,上面的需求该怎么实现呢。很简单:只要避免‘_’在此处作为通配符存在即可。如何避免呢,那就需要用到另外一个通配符'[]'。修改sql:
SELECT * FROM mode_info WHERE node_path LIKE 'abc[_]%'
至此处,问题已解决。
下面简单介绍下SQL通配符。

SQL通配符

通配符主要以下几种:%_[][^]

1. %:模糊匹配一个或多个字符。如,以ab开头

SELECT * FROM (SELECT 'abc_2sd_38u' 'a'UNION ALLSELECT 'bcf' 'a') cWHERE c.a LIKE 'ab%'

a
-----------
abc_2sd_38u

2. _:占位符,匹配任意一个字符。如,以abc_开头

SELECT * FROM (SELECT 'abc_2sd_38u' 'a'UNION ALLSELECT 'abcd_5d_3u' 'a'UNION ALLSELECT 'abc' 'a') cWHERE c.a LIKE 'abc[_]%'
a
-----------
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') xWHERE x.a LIKE '[12]%'
a
-----------
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') xWHERE x.a LIKE '[^12]%'
a
-----------
324


0 0
原创粉丝点击