Oracle中使用escape关键字实现like匹配特殊字符,以及&字符的转义

摘要:
SQL˃select*fromt_test_escape;NAME--------------------结果自然也为空SQL˃truncatetablet_test_escape;Tabletruncated--使用setdefineoff关闭替代变量的功能SQL˃setdefineoffSQL˃insertintot_test_escapevalues;1rowinsertedSQL˃insertintot_test_escapevalues;1rowinsertedSQL˃insertintot_test_escapevalues;1rowinsertedSQL˃commit;CommitcompleteSQL˃select*fromt_test_escape;NAME--------------------&_hello%%_helloOracle%&_hello--使用setdefineoff关闭变量替换功能之后,果然能够插入含有&的特殊字符了。如果不改变绑定变量的默认标识符,那么就使用chr去替代'&'!
转:http://blog.chinaunix.net/uid-26896647-id-3433968.html

问题描述:如果在一个表中的一个字段上存在'&', '_', '%'这样的特殊字符,而我们又得在where条件中使用到这些特殊字符怎么办?


1.创建含有这些特殊字符的表

SQL> create table t_test_escape(name varchar2(20));
Table created
SQL> insert into t_test_escape(name) values('&_hello');
1 row inserted

--这里会提示我输入变量_hello的值,我没有输入任何值,所以为空!
SQL> select * from t_test_escape;
NAME
--------------------

结果自然也为空
SQL> truncate table t_test_escape;
Table truncated

--使用set define off 关闭替代变量的功能
SQL> set define off
SQL> insert into t_test_escape(name) values('&_hello');
1 row inserted
SQL> insert into t_test_escape(name) values('%%_hello');
1 row inserted
SQL> insert into t_test_escape(name) values('Oracle%&_hello');
1 row inserted
SQL> commit;
Commit complete
SQL> select * from t_test_escape;
NAME
--------------------
&_hello
%%_hello
Oracle%&_hello

--使用set define off关闭变量替换功能之后,果然能够插入含有&的特殊字符了。


2.使用escape关键字在模糊查询中查看字符中含有%的字符串
SQL> select * from t_test_escape where name like '%a%%' escape 'a';
NAME
--------------------
%%_hello
Oracle%&_hello

--上面使用的转义字符为'a'

3.使用escape关键字模糊查询含有'&'的字符串
因为此时还是set define off的 所以这个时候&并不是什么特殊字符,所以下面的查询会报错
SQL> select * from t_test_escape where name like '%a&%' escape 'a';
select * from t_test_escape where name like '%a&%' escape 'a'
ORA-01424: missing or illegal character following the escape character
SQL> insert into t_test_escape(name) values('Oracle%&hello');
1 row inserted
SQL> commit;
Commit complete
SQL> select * from t_test_escape where name like '%a&h%' escape 'a';
select * from t_test_escape where name like '%a&h%' escape 'a'
ORA-01424: missing or illegal character following the escape character


在set define off关闭替代变量功能之后可以直接将&当做普通字符,而不用escape
SQL> select * from t_test_escape where name like '%&h%';
NAME
--------------------
Oracle%&hello
使用set define on打开替代变量功能
SQL> set define on;
SQL> select * from t_test_escape where name like '%&h%';

--这里会提示我输入变量h的值,因为我没有输入任何值,这条sql条件相当于就是like '%%',所以返回全部数据
NAME
--------------------
&_hello
%%_hello
Oracle%&_hello
Oracle%&hello
--使用escape关键字指定特定的转义字符试试看
SQL> select * from t_test_escape where name like '%a&h%' escape 'a';

NAME
--------------------

还是会提示我输入变量h的值

--下面通过查询出'&'的ascii来绕过这个障碍
SQL> select ascii('&') from dual;
ASCII('&')
----------
38

--使用chr(38)去替代特殊字符'&'
SQL> select * from t_test_escape where name like '%' || chr(38) || 'h%';
NAME
--------------------
Oracle%&hello

4.使用escape关键字模糊查询含有'&'的字符串
SQL> select * from t_test_escape where name like '%a_%' escape 'a';
NAME
--------------------
&_hello
%%_hello
Oracle%&_hello

5.下面我将替代变量的特殊字符改为$试试,然后看能不能使用模糊匹配匹配特殊字符'&'
SQL> set define $
SQL> select * from t_test_escape where name like '%&h%';
NAME
--------------------
Oracle%&hello


总结:对于使用escape关键字去转义特殊字符的时候,并不是对于所有的特殊字符都能够转义成功,上面的实验表明,对于'%', '_', '&'来说,使用escape是能够成功转义'%', '_'的,但是却不能转义'&',当然这只是默认的情况,如果我们将绑定变量的标识符设置为非默认的$,那么我们就可以把'&'当做普通字符对待了。如果不改变绑定变量的默认标识符,那么就使用chr(38)去替代'&'!


来自为知笔记(Wiz)

免责声明:文章转载自《Oracle中使用escape关键字实现like匹配特殊字符,以及&字符的转义》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇添加串口和虚拟终端输出帮助调试Unix套接字接口下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

dotnet run 提示System.Net.Sockets.SocketException (10049): 在其上下文中,该请求的地址无效。

更换端口号试一下。 查看官方文档 PS: 使用帮助命令 -h,可以指定启动配置文件: dotnet run --launch-profile  xxx 例如下面的配置文件,假如我们要使用codes-test的配置,可以这样:dotnet run --launch-profile  codes-test 学会看官方文档可以少走很多弯路。 { "iisS...

最高优先级

最高优先级 #include<stdio.h> #include<stdlib.h> #include<string.h> #define Max 100 typedef struct pcb {     char name[Max];  //进程名     int priority;    //优先级     int...

java/jsp获取当前路径的几种方法

本文结合个人实验与网上资料整合@http://blog.csdn.net/snannan_268/article/details/5511614 String path = new File(application.getRealPath(request.getServletPath() )).getParent();   //路径获取jsp文件绝对路径...

SQL数据库面试题

Database工程师面试 问题描述:为管理岗位业务培训信息,建立3个表:S (S#,SN,SD,SA) S#,SN,SD,SA 分别代表学号、学员姓名、所属单位、学员年龄C (C#,CN ) C#,CN 分别代表课程编号、课程名称SC ( S#,C#,G ) S#,C#,G 分别代表学号、所选修的课程编号、学习成绩要求实现如下5个处理:1. 使用标准SQ...

FLASHBACK介绍

在介绍flashback之前先介绍下undo_retention相关参数 undo_retention:表示undo数据的过期时间。系统默认这个时间设置为900即15分钟。但要注意,保证undo数据在这个时间内有效的前提是undo表空间有                         足够的空间存储。如果undo空间已满且又有新事务执行则会覆盖...

radio 获取选中值

Radio 1.获取选中值,三种方法都可以: 1 2 3 $('input:radio:checked').val(); $("input[type='radio']:checked").val(); $("input[name='rd']:checked").val(); 2.设置第一个Radio为选中值: 1 2 3 $('in...