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

转: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匹配特殊字符,以及&字符的转义

时间: 2024-12-09 04:57:53

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

Oracle中chr()和ascii()函数(附:常用字符与ascii对照表)

Oracle中chr()和ascii()函数(附:常用字符与ascii对照表) 关键字:chr() chr()函数作用:"特殊"字符特殊处理 在PLSql中可查询相对应的字码与特殊符 chr()函数示例: select chr(38) from dual;  ascii()函数示例: select ascii('&') from dual;      比如"&"到底为什么在Oracle中成了特殊字符呢?经过查找,终于揭晓了答案:原来&这个字符

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

1. SELECT 关键字用法: 检索单个列:select 列名 from 表名: 例:select ename from emp;检索多个列: select [列1,列2, ... ,列N] from 表名: 例:select ename , sal from emp;检索所有列:select * from 表名: 例:select * from emp; 2. 通配符(A): * :代表0个或多个列_ : 代表单个字符% : 代表0个或多个字符 使用通配符的优点:书写方便.可以检索未知列 使

Oracle 中 Start With 关键字

Start With (树查询) 基本语法如下: SELECT ... FROM + 表名 WHERE + 条件3 START WITH + 条件1 CONNECT BY PRIOR + 条件2 --示例 Select * From DEMO Start With ID = '00001' Connect By Prior ID = PID 条件1: 表示从哪个节点开始查找, 也就是通过条件1 查询到的数据, 作为后续查询的起始节点(参数). 当然可以放宽限定条件,如 ID in ('00001

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

用Oracle的编码转换的函数Convert实现,测试后可行. SQL> select *  2    from (select 'abcd' c1 from dual  3          union all  4          select 'ab测试cd' c1 from dual)  5   where c1 <> CONVERT(c1, 'US7ASCII', 'ZHS16GBK'); C1--------ab测试cd CONVERT函数说明: CONVERT(input

Oracle中NVARCHAR2字符集不匹配问题

Oracle中在做字符匹配时 遇到 NVARCHAR2 类型时报错,提示 字符集不匹配. 对使用 NVARCHAR2 的地方,需要对字段进行字符转换,加上 to_char(nvarchar2 字段) 即可. 例如: SELECT substr(bm.matnr, 3) wlbm, ms.maktx wlms, bm.meins jldw, bm.matkl wlz , bm.normt gybzms,bm.laeda gxsj,(case to_char(trim(bm.lvorm)) when

oracle中nvarchar2字符集不匹配

oracle当多表union时遇到nvarchar2类型时报错 字符集不匹配对使用nvarchar的地方,加上 to_char( nvarchar 的变量或字段 ) 如:select to_char(name),price from aa union allselect  to_char(name),price from bb 3张表aa,bb,cc都有 name price 字段 查询价格最高的前3位姓名 select * from(select to_char(name),price fro

oracle中的DECODE

原文:oracle中的DECODE DECODE函数相当于一条件语句(IF).它将输入数值与函数中的参数列表相比较,根据输入值返回一个对应值.函数的参数列表是由若干数值及其对应结果值组成的若干序偶形式.当然,如果未能与任何一个实参序偶匹配成功,则函数也有默认的返回值.区别于SQL的其它函数,DECODE函数还能识别和操作空值. 其具体的语法格式如下: DECODE(input_value,value,result[,value,result…][,default_result]); 其中: in

Sql与oracle中null值的区别

原贴链接请点击: 1 null值的介绍 NULL 是数据库中特有的数据类型,当一条记录的某个列为 NULL ,则表示这个列的值是未知的.是不确定的.既然是未知的,就有无数种的可能性.因此, NULL 并不是一个确定的值. 这是 NULL 的由来.也是 NULL 的基础,所有和 NULL 相关的操作的结果都可以从 NULL 的概念推导出来. 2 oracle中的null值介绍 在不知道具体有什么数据的时候,即未知,可以用NULL, 称它为空,ORACLE中,含有空值的表列长度为零.允许任何一种数据

Oracle中的DDL,DML,DCL总结

转自http://blog.csdn.net/w183705952/article/details/7354974 DML(Data Manipulation Language,数据操作语言):用于检索或者修改数据.    DML包括:  SELECT:用于检索数据:        INSERT:用于增加数据到数据库:        UPDATE:用于从数据库中修改现存的数据         DELETE:用于从数据库中删除数据. DDL(Data Definition Language,数据定