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
- SQL通配符
- SQL 通配符
- SQL 通配符
- SQL 通配符
- SQL 通配符
- SQL 通配符
- SQL - 通配符
- SQL 通配符
- SQL 通配符
- SQL 通配符
- SQL 通配符
- SQL 通配符
- SQL 通配符
- SQL 通配符
- sql通配符
- SQL 通配符
- SQL 通配符
- sql 通配符
- js学习笔记:基本类型和引用类型
- HTTP协议请求头信息和响应头信息详解
- C++宏定义详解
- Struts2入门——2,先写一个小例子
- 迷宫问题的最短路径
- SQL通配符
- 不想丑陋之动态加载模块初级篇
- 用OpenCV实现Photoshop算法(九): 高反差保留
- NIO学习笔记
- MyEclipse的注册码计算
- 【Leetcode】399. Evaluate Division
- 上传设置头像
- Linux运维笔记----Bash Scripts基础II
- 二叉树中和为某一值的路径