SQL模糊查询语句和Escape转义字符

摘要:
WHEREau_LnameLIKE'[C-P]arsen'将找到作者的姓氏,以arsen结尾,并以C和P.1之间的任何单个字符开头。LIKE“Mc%”将搜索所有以字母Mc开头的字符串(如McBadden)。2.LIKE“%inger”将搜索以字母inger结尾的所有字符串(如Ringer、Stringer)。

通配符描述示例
%包含零个或更多字符的任意字符串。WHERE title LIKE '%computer%' 将查找处于书名任意位置的包含单词 computer 的所有书名。
_(下划线)任何单个字符。WHERE au_fname LIKE '_ean' 将查找以 ean 结尾的所有 4 个字母的名字(Dean、Sean 等)。
[ ]指定范围 ([a-f]) 或集合 ([abcdef]) 中的任何单个字符。WHERE au_lname LIKE '[C-P]arsen' 将查找以arsen 结尾且以介于 C 与 P 之间的任何单个字符开始的作者姓氏,例如,Carsen、Larsen、Karsen 等。
[^]不属于指定范围 ([a-f]) 或集合 ([abcdef]) 的任何单个字符。WHERE au_lname LIKE 'de[^l]%' 将查找以 de 开始且其后的字母不为 l 的所有作者的姓氏。

将通配符作为文字使用

可以将通配符模式匹配字符串用作文字字符串,方法是将通配符放在括号中。下表显示了使用 LIKE 关键字和 [ ] 通配符的示例。

符号含义
LIKE '5[%]'5%
LIKE '[_]n'_n
LIKE '[a-cdf]'a、b、c、d 或 f
LIKE '[-acdf]'-、a、c、d 或 f
LIKE '[ [ ]'[
LIKE ']']
LIKE 'abc[_]d%'abc_d 和 abc_de
LIKE 'abc[def]'abcd、abce 和 abcf
SQL模糊查询,使用like比较字,加上SQL里的通配符,请参考以下: 

1、LIKE'Mc%' 将搜索以字母 Mc 开头的所有字符串(如 McBadden)。
2、LIKE'%inger' 将搜索以字母 inger 结尾的所有字符串(如 Ringer、Stringer)。
3、LIKE'%en%' 将搜索在任何位置包含字母 en 的所有字符串(如 Bennet、Green、McBadden)。
4、LIKE'_heryl' 将搜索以字母 heryl 结尾的所有六个字母的名称(如 Cheryl、Sheryl)。
5、LIKE'[CK]ars[eo]n' 将搜索下列字符串:Carsen、Karsen、Carson 和 Karson(如 Carson)。
6、LIKE'[M-Z]inger' 将搜索以字符串 inger 结尾、以从 M 到 Z 的任何单个字母开头的所有名称(如 Ringer)。
7、LIKE'M[^c]%' 将搜索以字母 M 开头,并且第二个字母不是 c 的所有名称(如MacFeather)。
Escape 转义字符
用户输入如果没有任何限制的话,则必须对特殊字符进行变换。 
如果对单引号不进行变换,则会发生数据库错误,甚至可能导致系统崩溃。

不过回避方法却非常简单,只要将单引号
[']转换成两个单引号['']就可以了。
例:SELECT * FROM TBL WHERE COL = 'ABC''DEF'; 
模糊查询的语句虽然不会发生SQL错误,但是不进行回避的话,则无法得到要检索的值。

回避方法较单引号复杂。需要使用转义符。将
[%]转为[\%][_]转为[\_]

然后再加上
[ESCAPE '\']就可以了。
例:SELECT * FROM TBL WHERE COL LIKE 'ABC\%\_%' ESCAPE '\'; 

  
最后一个%是通配符。
如果做日文项目的话,会出现全角字符的[][_]

而这两个全角字符同样会作为半角通配符处理。

所以在变换时,同时需要将
全角的[][_]进行变换。
例:SELECT * FROM TBL WHERE COL LIKE 'ABC\%\_\\_%' ESCAPE '\'; 

变换成这样似乎结束了,可是不要忘了还有转义符自身,万一用户输入转义符的话,
以上的处理就会发生
SQL错误。所以也必须对转义符进行变换。变换方法就是将[\]转换为[\\]

例:SELECT * FROM TBL WHERE COL LIKE 'ABC\%\_\\\\_%' ESCAPE '\'; 
以上的操作都针对于一般的数据类型,如CHARVARCHAR2

如果出现
NCHARNVARCHAR2的话,以上的处理就会出现ORA-01425错误。



如果改成以下写法,则会发生
ORA-01424错误。
SELECT * FROM TBL WHERE COL LIKE '%\_%' ESCAPE TO_NCHAR('\') 
正确的写法应该是 
SELECT * FROM TBL WHERE COL LIKEC '%\_%' ESCAPE TO_NCHAR('\') 


最后要说明的是每个
like都应该写ESCAPE语句。
例:

SELECT * FROM TBL

WHERE COL1 LIKE '%\
_%' ESCAPE '\' OR COL2 LIKE '%\_%' ESCAPE '\'

SQL> select * from test;

TEST
--------------------
sdd_kk
d'd
dfsfsa
dffa%asfs
12345
1%2345
1%54321
2%54321
%%54321
A&B

已选择9行。

        其中包含特殊的字符分别为%,_,&,有可能包含这些字符的数据含有错误,或者需要查找包含这些字符的数据。


SQL> select * from test where test like 'sdd _%' escape ' ';

TEST
--------------------
sdd_kk

        转义字符为' '(空格);

SQL> select * from test where test like 'sdd\_%' escape '\';

TEST
--------------------
sdd_kk

转义字符为'\';


SQL> select * from test where test like 'sdd=_%' escape '=';

TEST
--------------------
sdd_kk

        转义字符为'=';

SQL> select * from test where test like 'sdd/_%' escape '/';

TEST
--------------------
sdd_kk

          转义字符为'/';

SQL> select * from test where test like 'sddd_%' escape 'd';

未选定行

        转义字符为d,没有实现转义功能;

SQL> select * from test where test like '%\_%' escape '\';

TEST
--------------------
sdd_kk

        查找包含所有'_'的字段。

        同理:通过这种方法查找含有'%'的所有字段:

SQL> select * from test where test like '%\%%' escape '\';

TEST
--------------------
dffa%asfs
1%2345
1%54321
2%54321
%%54321

        但是'&'不能通过转义字符查找:

SQL> select * from test where test like '%\&%' escape'\';
select * from test where test like '%\&%' escape'\'
                                   *
第 1 行出现错误:
ORA-01424: 转义符之后字符缺失或非法

        可以通过另外的方式进行转义:

SQL> select ascii('&') from dual;

ASCII('&')
----------
        38

SQL> select * from test where test like '%'||chr(38)||'%';

TEST
--------------------
A&B

          '''的转义:

SQL> select * from test where test like '%''%';

TEST
--------------------
d'd

特殊符号的数据的插入

SQL> insert into test values('test&test');
输入 test 的值: test
原值    1: insert into test values('test&test')
新值    1: insert into test values('testtest')          -虽然插入,但是数据不对。

已创建 1 行。

SQL> show define
define "&" (hex 26)
SQL> set define off
SQL> show define
define OFF
SQL> insert into test values('test&test');

已创建 1 行。

SQL> show escape
escape OFF
SQL> set escape on
SQL> show escape
escape "\" (hex 5c)
SQL> insert into test values('test\&test');

已创建 1 行。

SQL> select * from test;

TEST
--------------------
sdd_kk
d'd
dfsfsa
dffa%asfs
12345
1%2345
1%54321
2%54321
%%54321
A&B
testtest

TEST
--------------------
test&test
test&test

已选择13行。

SQL> commit;

提交完成。

SQL> select * from test;

TEST
--------------------
sdd_kk
d'd
dfsfsa
dffa%asfs
12345
1%2345
1%54321
2%54321
%%54321
A&B
testtest

TEST
--------------------
test&test
test&test

已选择13行。

SQL> insert into test values('test\%test');

已创建 1 行。

SQL> insert into test values('test\_test');

已创建 1 行。

SQL> insert into test values('test\'test);
insert into test values('test'test)
                              *
第 1 行出现错误:
ORA-00917: 缺失逗号


SQL> insert into test values('test''test');

已创建 1 行。

SQL> select * from test;

TEST
--------------------
sdd_kk
d'd
dfsfsa
dffa%asfs
12345
1%2345
1%54321
2%54321
%%54321
A&B
testtest

TEST
--------------------
test&test
test&test
test%test
test_test
test'test

已选择16行。

连接符‘||’导致了新一轮的转义:连接符号‘||’左右的单引号没有任何的关系,除非‘||’是作为字符串的一部分(这在动态SQL中很常见)。

SQL> SELECT 'ORACLE'||'''' FROM DUAL;

'ORACLE'||''
----------
ORACLE'
个人理解,'ORACLE'||'''' 后面的“''''”应该认为是一个字符串(即前后单引号,中间是“''”串,而中间又是密集单引号,因此第一个为转义功能)
SQL> SELECT 'ORACLE''''' FROM DUAL;

'ORACLE'''''
------------
ORACLE''


对于第一个,前两个单引号配对,后面四个单引号按照上面的第一条原则分配,既:SELECT 'ORACLE'||'''' FROM DUAL;
对于第二个,由于第二个单引号后面存在单引号,所以就不与第一个配对,而是充当了转义的角色。既:SELECT 'ORACLE''''' FROM DUAL;

注:本人引用了网友的资源,如侵犯了您的版权,请告知,我会立即修改指明出处

免责声明:文章转载自《SQL模糊查询语句和Escape转义字符》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇scp命令详解谈谈市面上无线路由器的性能和芯片下篇

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

相关文章

Linux 内核编译步骤及配置详解

linux 系统体系结构: linux kernel体系结构:arm有7种工作模式,x86也实现了4个不同级别RING0-RING3,RING0级别最高,这样linux用户代码运行在RING3下,内核运行在RING0,这样系统本身就得到了充分的保护 用户空间(用户模式)转到内核空间(系统模式)方法:·系统调用·硬件中断 linux kernel 体系结构...

CKEditor扩展插件:自动排版功能

CKEditor是新一代的FCKeditor,是一个重新开发的版本。CKEditor是全球最优秀的网页在线文字编辑器之一,因其惊人的性能与可扩展性而广泛的被运用于各大网站。 如果还没接触过的可以看看,在线演示地址:http://ckeditor.com/demo 当然了,今天我们的主要目的还不是介绍。 还未下载CKEditor的同学可以点击下载:http:...

unittest---unittest错误截图

  在做自动化的过程中,大多数执行者都不在旁边,那么如果用例失败了我们通常看报告上的失败信息,但是这样有时候可能不够清楚的判断到底哪里出了错误,我们还可以通过自动截图的功能,判断用例走到哪里出了错误。 截图方法 在自动化中截图方法有几种,我们一个个来看,那种最适合我们。 方法1:get_screensho t_as_file(self,filename)...

quartz结合多线程处理后台业务

  最近项目中有播放视频的需求,技术选型采用UMS播放器,免费版只能播放FLV格式的视频文件,因此需要对用户上传的视频进行格式转换,转换工具为FormatFactory,功能还是比较强大的。但是面临的一个问题,视频转换是非常耗时的,上传完直接转换是没法接受的,于是决定采用quartz,以任务调度的方式,在后台进行转换,具体步骤如下:   1.定义一个任务...

python 获取系统时间,新建时间目录

import datetime import os theTime = datetime.datetime.now() print(theTime) theTime = str(theTime) date_split = theTime.strip().split(' ') date_today = date_split[0].replace('-', '...

iOS开发-OC语言 (一)oc数据类型

分享一套以前学习iOS开发时学习整理的资料,后面整套持续更新: oc数据类型 数据类型:基本数据类型、指针数据类型 基本数据类型:数值型、字符型(char)、布尔型、空类型(void) 指针数据类型:类(class)、id 数值型:整数类型int、浮点型float、double c和oc的基本数据类型 int:声明整型变量 double:声明双精度变量 f...