问题描述:如果在一个表中的一个字段上存在'&',  '_',  '%'这样的特殊字符,而我们又得在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)去替代'&'!

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

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

    http://blog.chinaunix.net/uid-26896647-id-3433968.html http://soft.chinabyte.com/database/398/124298 ...

  2. Oracle 中的SELECT 关键字(查询、检索)

    1. SELECT 关键字用法: 检索单个列:select 列名 from 表名: 例:select ename from emp;检索多个列: select [列1,列2, ... ,列N] fro ...

  3. Oracle 中 Start With 关键字

    Start With (树查询) 基本语法如下: SELECT ... FROM + 表名 WHERE + 条件3 START WITH + 条件1 CONNECT BY PRIOR + 条件2 -- ...

  4. Oracle中如何用SQL检测字段是否包括中文字符

    用Oracle的编码转换的函数Convert实现,测试后可行. SQL> select *  2    from (select 'abcd' c1 from dual  3          ...

  5. Oracle中转义下划线

    原意是查询出所有的月粒度模型,但是在oracle中,下划线也代表匹配单一任何字符,导致15分钟粒度的模型也被查询出来,在此,需要对下划线做转义,使其只表示下划线的含义,可以使用ESCAPE()函数. ...

  6. Oracle中的特殊判式

    Oracle中的特殊判式 除了逻辑运算之外,Oracle提供了一些特殊判式.这些判式可以用来生成更加复杂和灵活的查询条件.本节将着重介绍以下几种判式. Between: 取值范围 In: 集合成员测试 ...

  7. oracle中的控制语句

    一.条件语句1.流程控制-if else(1)ifif 判断条件 then      ...end if;(2)if-elseif 判断条件 then      ...else      ...end ...

  8. ORACLE中ESCAPE关键字用法

    ESCAPE用法 1.使用 ESCAPE 关键字定义转义符: 在模式中,当转义符置于通配符之前时,该通配符就解释为普通字符. 2.ESCAPE 'escape_character'  允许在字符串中搜 ...

  9. 下划线“_”在oracle中不是单纯的表示下划线的意思,而是表示匹配单一任何字符!

    [解决办法]1.使用 escape() 函数escape关键字经常用于使某些特殊字符,如通配符:'%','_'转义为它们原来的字符的意义,被定义的转义字符通常使用'\',但是也可以使用其他的符号.例如 ...

随机推荐

  1. 数字式PID控制的应用总结

    PID控制是一个二阶线性闭环控制器,通过调整比例.积分和微分三项参数,使得大多数的工业控制系统获得良好的闭环控制性能.PID控制优点:a. 技术成熟,b. 易被人们熟悉和掌握,c. 不需要建立数学模型 ...

  2. 【娱乐】高端小游戏Manufactoria

    Manufactoria 是一款游戏.游戏中,一家生产机器人的工厂内部出了一 些问题,生产出来的机器人有很多不合格的.一个机器人可以用一个含有红色和 蓝色的颜色串来描述,只有颜色串符合某种规律的机器人 ...

  3. CentOS安装RockMongo

    rockmongo官网下载页面在这里: http://rockmongo.com/downloads 找到最新版本的下载链接,一般第一个就是: 右键复制url,比如说是这个: http://rockm ...

  4. uva 11174

    刘书上例题 #include <cstdio> #include <cstdlib> #include <cmath> #include <map> # ...

  5. web配置详解

    1.启动一个WEB项目的时候,WEB容器会去读取它的配置文件web.xml,读取<listener>和<context-param>两个结点. 2.紧急着,容创建一个Servl ...

  6. Unity3D 游戏开发构架篇 ——角色类的设计与持久化

    在游戏开发中,游戏角色占了很大的篇幅,可以说游戏中所有的内容都是由主角所带动.这里就介绍一下角色类的设计和持久化. 一.角色类应用场景和设计思想 游戏中的角色类型不一而足,有不同的技能,有不同的属性等 ...

  7. Openstack Quantum project 更名为 Neuron

    因为与磁带备份厂商Quantum商标冲突: The OpenStack Foundation has changed the name of its networking project from Q ...

  8. nginx模块开发(18)—日志分析

    1.日志简介 nginx日志主要有两种:访问日志和错误日志.访问日志主要记录客户端访问nginx的每一个请求,格式可以自定义:错误日志主要记录客户端访问nginx出错时的日志,格式不支持自定义.两种日 ...

  9. lintcode :Remove Duplicates from Sorted List 删除排序链表中的重复元素

    题目: 删除排序链表中的重复元素 给定一个排序链表,删除所有重复的元素每个元素只留下一个.   您在真实的面试中是否遇到过这个题? 样例 给出1->1->2->null,返回 1-& ...

  10. [Python]读写文件方法

    http://www.cnblogs.com/lovebread/archive/2009/12/24/1631108.html [Python]读写文件方法 http://www.cnblogs.c ...