【模糊查询】oracle中带有特殊符号的模糊查询
首先讲一下Oracle模糊查询,模糊查询使用的是like关键字 [ ]:表示括号内所列字符中的一个(类似正则表达式)。 [^ ] :表示不在括号所列之内的单个字符。其取值和 [] 相同,但它要求所匹配对象为指定字符以外的任一个字符。 注:oracle like 不支持正则,你可以使用支持like的正则regexp_like 例子:
select * from table_name where regexp_like(name,'[张李王]三'); 查询name值为张三,李三,王三的记录,及[张李王]其中一个字符和'三'匹配; --创建测试表: create table LIKETESTTABLE ( ID NUMBER not null,NAME VARCHAR2(100),CONTENT CLOB,TITLE VARCHAR2(200),FORMS VARCHAR2(200) ) --插入测试数据: insert into liketesttable (ID,NAME,CONTENT,TITLE,FORMS) values (1,'张三','<CLOB>','明天_天气不错','hello#ggg'); insert into liketesttable (ID,FORMS) values (2,'王三','hello*ffdd'); insert into liketesttable (ID,FORMS) values (3,'李三','hello$ddd'); insert into liketesttable (ID,FORMS) values (4,'李四','hello@ddd'); insert into liketesttable (ID,FORMS) values (6,'王八','hello_ggg'); insert into liketesttable (ID,FORMS) values (7,'舅舅','hello_ffffff'); insert into liketesttable (ID,FORMS) values (5,'王五','hello~ddd');注意clob是大字段,这里显示不出来,真实数据自己添加;
用like语句查询的话可以,但是有特殊符号的话不能识别,如:#,%,_ 等 第一种方法: select * from liketesttable where regexp_like(forms,'hello[_]')输出结果: ID NAME CONTENT TITLE FORMS 1 6 王八 明天_天气不错 hello_ggg 2 7 舅舅 明天_天气不错 hello_ffffff hello[_]就是我们输入的参数,它会查找和name中值匹配的数据记录,hello[_]中包含了特殊的字符“#”; 如果是使用普通的模糊查询: select *from liketesttable where forms like 'hello_%' 输出结果: ID NAME CONTENT TITLE FORMS 1 1 张三 明天_天气不错 hello#ggg 2 2 王三 明天_天气不错 hello*ffdd 3 3 李三 明天_天气不错 hello$ddd 4 4 李四 明天_天气不错 hello@ddd 5 6 王八 明天_天气不错 hello_ggg 6 7 舅舅 明天_天气不错 hello_ffffff 7 5 王五 明天_天气不错 hello~ddd因为“_”与(通配符“_”代表一个字符)冲突了,所以hello_%查出了所以结果;
select * from emp where ename like '%?_%' escape '?'; --转义符为问号? select * from emp where ename like '%/_' escape '/'; --转义符为斜杠/--查找所有以_结尾的 select * from emp where ename like '%_' escape ''; --转义符为反斜杠同理,通过这种方法查找含有'%'的所有字段: select * from emp where ename like '%%%' escape ''; 改写第一种查询方法:sql: select * from liketesttable where forms like '%_%' escape '';输出结果: ID NAME CONTENT TITLE FORMS 1 6 王八 明天_天气不错 hello_ggg 2 7 舅舅 明天_天气不错 hello_ffffff 但 是'&'不能通过转义字符查找 如果按上面的写法, select * from liketesttable where forms like 'hello&;%' escape '';会提示:ORA-01424: 转义符之后字符缺失或非法 可以通过另外的方式进行转义: select ascii('&') from dual; ASCII('&') ---------- 38 正确写法: select *from liketesttable where forms like 'hello'|| chr(38) ||'%' 在oracle中chr()函数和ascii()是一对反函数 但是,注意%不能用这种方法转义(%号的ascii码为37)因为转出来还是一个%号,还是会当做通配符找出所有的数据;
--单引号的转义 select * from liketesttable where forms like 'hello'%' escape ''; 会提示:ORA-01756:引号内的字符串没有正确结束,因为不能正确识别结束 --查找所有含有单引号的名字 select *from liketesttable where forms like 'hello''%' 单引号的转义可以参考: http://wjlvivid.iteye.com/blog/1684535 附: 转义和不转义: 转义:like 'DB_Design'-->查的是'DB_Design'这个字符串,只有这个符合; 不转义:like 'DB_Design'-->查的是所有符合'DB_Design'的字符串“_”代表一个字符,可以是任意的字符,例如'DBFDesign','DBHDesign','DByDesign'都符合; 转义就是将特殊的字符变成一个普通的字符; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |