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

来源:http://www.cnblogs.com/amylis_chen/archive/2010/07/16/1778921.html

通配符 描述 示例
% 包含零个或更多字符的任意字符串。 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 的所有作者的姓氏。


将通配符作为文字使用(用中括号包围,不适用postgreSQL
可以将通配符模式匹配字符串用作文字字符串,方法是将通配符放在括号中。下表显示了使用 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 转义字符
( SQL Server 支持 like '\%%' escape '\'  和 like '/%%'  escape '/' 两种斜杠 )

( PostgreSQL 只支持 like '/%%'  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 '\';
以上的操作都针对于一般的数据类型,如CHAR、VARCHAR2。 如果出现NCHAR、NVARCHAR2的话,以上的处理就会出现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;

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/497956.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JAVA格式化同一天时间间隔_java中时间格式化怎么去时间间隔值

java中时间格式化怎么去时间间隔值关注:61 答案:2 mip版解决时间 2021-01-12 11:52提问者眼泪↓流到叻心里2021-01-11 20:30比如2015-02-03 13:25:55 与 2015-02-04 15:25:55 之间的时间间隔怎么获取最佳答案二级知识专家守給你的承諾2021-01-11 21:46转换成秒-相减取绝对值。…

超美国11倍!麦肯锡176页报告解读数字中国领先全球的秘密

来源:智东西 概要:到2030年,数字化将转变并创造高达45%的行业总收入。 12月4日,麦肯锡发布了长达176页的中国数字经济报告。 报告显示,中国电子商务(2016年交易额占全球40%)和数字支付&#xf…

SQL Server查询中特殊字符的处理方法

来源:http://database.51cto.com/art/201009/227766.htm SQL Server查询中,经常会遇到一些特殊字符,比如单引号“”等,这些字符的处理方法,是SQL Server用户都应该需要知道的。 我们都知道SQL Server查询过程中&…

JAVA发送邮件工具包_java mail 发送邮件工具包

Java测试发送邮件的时候经常出现异常,检查多次账户名密码无误后,依然出现如下图错误: 之前不清楚,后面在网上得到提醒,我们所使用的smtp服务器使用的密码与我们自身登录网页端邮箱的密码是不一样的,以163邮…

卡内基梅隆大学提出基于学习的动作捕捉模型,用自监督学习实现人类3D动作追踪

原文来源:Cornell University Library 作者:Hsiao-Yu Fish Tung、Hsiao-Wei Tung、Ersin Yumer、 Katerina Fragkiadaki 「雷克世界」编译:我是卡布达、哆啦A亮 目前,从单摄像头中进行动作捕捉(motioncapture&#xff…

session过期时间控制的一些常用方法

来源:http://blog.csdn.net/luo_yifan/article/details/4659392 在一般系统登录后,都会设置一个当前session失效的时间,以确保在用户没有使用系统一定时间后,自动退出登录,销毁session。 具体设置很简单&#xff1a…

java 昵称1到32位字符_Java期末考试编程题复习

在程序中定义Person类&#xff0c;为该类编写如下字段、构造器、访问器、修改器和相应的其他方法。(20分)<1>在Person类中定义两个字段&#xff1a; 私有访问权限&#xff0c;类型为String的name字段&#xff1b; 私有访问权限&#xff0c;类型为int的age字段。<2>…

AI智商评测标准专家研讨会邀请,2018年12月20日北京

21世纪以来&#xff0c;人工智能领域陆续爆发很多重要事件。其中最吸引人们眼球的&#xff0c;当属2016年战胜了人类围棋冠军并开始能够从0自我学习的AlphaGo。 10月26日&#xff0c;软银CEO孙正义在沙特阿拉伯举行的未来投资计划大会上称&#xff0c;未来30年内AI的智商&#…

java代码pingip_java程序ping IP

package com.fdway.tool;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;/**** ping IP地址检查IP地址能否可用**/public class PingIPUtil {public static void main(String[] args) throws IOExce…

HTML 显示特殊字符时转义操作

/*** 转换 HTML 特殊字符*/public static String escape( String s ){if( StringUtils.isBlank( s ) ){return " ";}StringBuilder sb new StringBuilder( s.length() );for( int i 0 ; i < s.length() ; i ){char c s.charAt( i );switch( c ){case < : sb…

开源神经网络框架Caffe2全介绍

本文作者吴逸鸣&#xff0c;整理自作者在GTC China 2017大会上的演讲&#xff0c;首发于作者的知乎文章。 我个人认为这是一份很值得分享的资料&#xff0c;因为 这应该是第一次使用全中文来讲解Caffe2和FB的AI应用的演讲 观看这次演讲不需要机器学习&#xff0f;神经网络&…

JAVA设置jscrollbar大小_JScrollBar垂直/水平设置问题 – Java Swing

下面是我上面提到的一个小的可编辑代码片段.我同意camickr你不应该使用绝对定位而是使用布局管理器.如果你绝对需要为JTextField提供一个水平滚动条,那么让它工作的一种方法就是让它始终显示,使用允许这个的JScrollPane构造函数.即,JScrollPane inputPane new JScrollPane(inp…

TPTP(Java Profiling Tools插件)对Java程序进行性能测试

来源&#xff1a;http://blog.csdn.net/wsj19890201/article/details/5492517 TPTP下载地址&#xff1a;http://www.eclipse.org/tptp/ 概述&#xff1a;Eclipse Test & Performance Tools Platform (TPTP) 的性能测试工具 (Profiling tool)能够用于优化eclipse插件应用、…

AI指数评论:提防“路灯谬误”,开启全球多方对话

来源&#xff1a;亿欧 概要&#xff1a;技术的单点突破&#xff0c;资本市场的多级繁荣&#xff0c;诸如此类的话题充斥着过去两到三年。然而&#xff0c;在AI时代思考AI&#xff0c;我们需要更宏大的世界观。 技术的单点突破&#xff0c;资本市场的多级繁荣&#xff0c;诸如此…

算法还是算力?周志华微博引爆深度学习的“鸡生蛋,蛋生鸡”问题

来源&#xff1a;AI科技大本营上周&#xff0c;由强化学习加持的AlphaZero&#xff0c;把DeepMind在围棋上的突破成功泛化到其他棋类游戏&#xff1a;8小时打败李世石版AlphaGo&#xff0c;4小时击败国际象棋最强AI——Stockfish&#xff0c;2小时干掉日本象棋最强AI——Elmo&a…

java求平均值Scanner_Scanner的一些问题

import java.util.Scanner;public class 无参带返回值方法的使用 {public static void main(String[] args) {// 创建名为hello的对象无参带返回值方法的使用 hello new 无参带返回值方法的使用();// 调用hello对象的calcAvg()方法&#xff0c;并将返回值保存在变量avg中doubl…

WeakHashMap

来源&#xff1a;http://hecc-cqut.iteye.com/blog/984235 在广大的Java界&#xff0c;关于WeakHashMap一直都存在这么个传说&#xff1a; Java代码 在WeakHashMap 中&#xff0c;当某个键不再正常使用时&#xff0c;自动移除其条目 在WeakHashMap 中&#xff0c;当某个键不再…

计算机视觉大规模爆发,6大细分领域将撑起725亿元市场

来源&#xff1a;中国经济时报概要&#xff1a;近几年来&#xff0c;随着技术的发展&#xff0c;中国计算机视觉行业发展迅速。近几年来&#xff0c;随着技术的发展&#xff0c;中国计算机视觉行业发展迅速。尤其是2016年下半年&#xff0c;1∶N人脸识别、视频结构化等计算机视…

java项目内存使用率过高排查_项目内存或者 cpu 占用率过高如何排查

前言:小编总结了之前生产环境cpu 占用率过高等问题,小编功力不够深厚,文章如有不对的地方,还望各位大神指正。排查原因&#xff1a;客服反馈说系统访问缓慢一、 在排查问题的过程中针对 CPU 的问题&#xff0c; 使用以下命令组合来排查问题模拟过程:①示例代码&#xff1a;pack…

java怎么自动提示关键词_Eclipse 实现关键字自动补全功能 (转)

一般默认情况下&#xff0c;Eclipse &#xff0c;MyEclipse 的代码提示功能是比Microsoft Visual Studio的差很多的&#xff0c;主要是Eclipse &#xff0c;MyEclipse本身有很多选项是默认关闭的&#xff0c;要开发者自己去手动配置。如果开发者不清楚的话&#xff0c;就不知道…