Oracle 特殊字符模糊查询的方法

最近在写DAO层的时候,遇到一个问题,就是使用like进行模糊查询时,输入下划线,无法精确查到数据,而是返回所有的数据。

这让我很好奇,百度之后才发现,原来是因为有些特殊字符需要进行转义才可以进行查询。

首先理解一下什么是特殊字符。

在ascii码表中,特殊字符的范围如下。即从32~47 58~64 91~96 123~126。

模糊查询时,有两种方法可以进行转换。

1. 使用REGEXP_LIKE方法,这是个使用正则表达式来查询的方法,因此有此字符需要进行转义才能查询,如$ *等,转义符为反斜杠\,因此反斜杠也要进行转。这里只讨论字符中包含某字符串的情况,对于正则表达式的匹配不作讨论。

2. 使用like关键字,配合escape关键字进行转义。

字符匹配操作可以使用通配符 “%” 和 “_”:

%:表示任意个字符,包括零个;

_:表示一个任意字符;上文说到输入下划线会查出所有就是因为只要有任意一个字符都可以查询出来。

同时,对于单引号,在oracle中,例如select * from tableTest t where t.name like ‘%‘%‘ escape ‘\‘ 那么like语句中的‘会与前一个单引号匹配,造成语法错误。使用转义符号也无法正常结束。需要将单个单引号转成两个单引号,select * from tableTest t where t.name like ‘%‘‘%‘ escape ‘\‘

因此,上面两个字符,以及用来转义的字符(通常使用反斜杠)需要进行转义。

那么问题又来了,在Java代码中,如果使用JDBC的PreparedStatement进行预编译,是不是就可以不需要进行转义了?

just do it!

答案是否定的,还是需要进行转义。注意下面,没有进行转义,查出的结果仍然是所有记录。

转义后就精确了。

还应注意两点:

1. jdbc会自动加上单引号,赋值时不必添加单引号

2. jdbc会自动将单个单引号转换成两个的,赋值时不必写两个单引号

时间: 2024-10-26 19:04:02

Oracle 特殊字符模糊查询的方法的相关文章

LinqToEntity模糊查询的方法选择

LinqToEntity针对oracle模糊查询 方法:Contains() 转换出来的sql是  like  关键字 方法:IndexOf()  转换出来的sql是  instr()  函数 like 和 instr() 方法对于模糊查询的效率 有时有很大的差异,使用时可根据需要选择

回味Oracle的模糊查询

select table_name,tablespace_name,temporary from user_tables where table_name like '%PROV%' 分析: table_name:表名(varchar2(30)); tablespace_name:存储表名的表空间(varchar2(30)): temporary:是否为临时表(varchar2(1)). 4种通配符的含义 % 表示零个或多个字符 _ 表示单个字符 [] 表示范围[a-f]或集合[abcdef]的

MySQL单表多字段模糊查询解决方法

在最近的一个项目需要实现在单表中对多字段进行多个关键字的模糊查询,但这数个关键字并不一定都存在于某个字段 例如现有table表,其中有title,tag,description三个字段,分别记录一条资料的标题,标签和介绍.然后根据用户输入的查询请求,将输入的字串通过空格分割为多个关键字,再在这三个字段中查询包含这些关键字的记录. 可目前遇到的问题是,这些关键字是可能存在于三个字段中的任意一个或者多个,但又要求三个字段必须包含所有的关键词.如果分别对每个字段进行模糊匹配,是没法实现所需的要求,由此

mybatis oracle 分页+模糊查询

实现分页的方式有很多,但常用的是通过SQL来显示分页. 下面就来介绍mybatis 来实现Oracle分页的写法:(ps:不同数据库的写法有区别) 一.分页数据: 1 <select id="findPageByCode" parameterType="java.util.Map" resultMap="pageVO"> 2 select * from 3 ( 4 select A.* ,ROWNUM rn 5 from (selec

oracle 中模糊查询对like的代替insrt()函数 可以做到效率节约一倍以上

昨天在处理一个字符拆分的功能时,用用到了insrt()函数,偶然发现其实特可以代替模糊查询的like,经多次测试可节约效率一倍以上. 代码如下: select distinct(a.deptname) from sys_depart a, gzdb_task b where instr(a.deptname,b.acceptor ) > 0; select distinct(a.deptname) from sys_depart a, gzdb_task b where a.deptname l

oracle like 模糊查询

在一些查询时,可能把握不准需要查询的确切值,比如百度搜索时输入关键字即可查询出相关的结果,这种查询称为模糊查询. 模糊查询使用LIKE关键字通过字符匹配检索出所需要的数据行.字符匹配操作可以使用通配符"%"和"_": %:表示零个或者多个任意字符._:代表一个任意字符. 语法是:LIKE '字符串'[ESCAPE '字符'].匹配的字符串中,ESCAPE后面的"字符"作为转义字符. 通配符表达式 'S%'                  以S开

oracle like模糊查询不能走索引?

这里要纠正一个网上很多教程说的模糊匹配不能走索引的说法,因为在看<收获,不止SQL优化>一书,里面举例说到了,并且自己也跟着例子实践了一下,确实like一些特殊情况也是可以走索引的 例子来自<收获,不止SQL优化>一书,实践准备: //建表,注意要非空数据 drop table t purge; create table t as select * from dba_objects where object_id is not null; select * from t; //更新

oracle like模糊查询简单用法

like  用法介绍: 1."_":匹配单个任意字符 select * from bqh3 where name like '_崔'; 2."%":匹配0个或多个任意字符.但有三种情况如下: like %关键字:以关键字开头的记录 like 关键字%:以关键字结尾的记录 like %关键字% :包含以关键字的记录 查询以A开头的全部信息 select * from bqh3 where name like 'A%' 查询第二个字母以A开头的全部信息: select

oracle 模糊查询 (处理jsp页面传过来的条件)

oracle数据模糊查询的语句: SELECT m.MUSICID,m.MUSICNAME,m.MUSICPICTURE,m.MUSICLYRICS,m.MUSICINSTRUCTION FROM MUSIC m where m.musicname like '%见%'; 本来 我是打算通过 实体类(entity),数据访问层(dao),业务逻辑层(biz)封装后 在Action中调用模糊查询的方法  来实现 根据我输入的 关键字 来进行模糊查询. 试了好多SQL都没有用  提示 为 "非正确语