日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

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

發(fā)布時(shí)間:2024/7/23 数据库 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SQL模糊查询语句和Escape转义字符 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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

通配符 描述 示例
% 包含零個(gè)或更多字符的任意字符串。 WHERE title LIKE '%computer%' 將查找處于書名任意位置的包含單詞 computer 的所有書名。


_(下劃線) 任何單個(gè)字符。 WHERE au_fname LIKE '_ean' 將查找以 ean 結(jié)尾的所有 4 個(gè)字母的名字(Dean、Sean 等)。?


[ ] 指定范圍 ([a-f]) 或集合 ([abcdef]) 中的任何單個(gè)字符。 WHERE au_lname LIKE '[C-P]arsen' 將查找以arsen 結(jié)尾且以介于 C 與 P 之間的任何單個(gè)字符開始的作者姓氏,例如,Carsen、Larsen、Karsen 等。


[^] 不屬于指定范圍 ([a-f]) 或集合 ([abcdef]) 的任何單個(gè)字符。 WHERE au_lname LIKE 'de[^l]%' 將查找以 de 開始且其后的字母不為 l 的所有作者的姓氏。


將通配符作為文字使用(用中括號包圍,不適用postgreSQL
可以將通配符模式匹配字符串用作文字字符串,方法是將通配符放在括號中。下表顯示了使用 LIKE 關(guān)鍵字和 [ ] 通配符的示例。

符號 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?含義
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 結(jié)尾的所有字符串(如 Ringer、Stringer)。
3、LIKE'%en%' 將搜索在任何位置包含字母 en 的所有字符串(如 Bennet、Green、McBadden)。
4、LIKE'_heryl' 將搜索以字母 heryl 結(jié)尾的所有六個(gè)字母的名稱(如 Cheryl、Sheryl)。
5、LIKE'[CK]ars[eo]n' 將搜索下列字符串:Carsen、Karsen、Carson 和 Karson(如 Carson)。
6、LIKE'[M-Z]inger' 將搜索以字符串 inger 結(jié)尾、以從 M 到 Z 的任何單個(gè)字母開頭的所有名稱(如 Ringer)。
7、LIKE'M[^c]%' 將搜索以字母 M 開頭,并且第二個(gè)字母不是 c 的所有名稱(如MacFeather)。

Escape 轉(zhuǎn)義字符
( SQL Server 支持 like '\%%' escape '\' ?和 like '/%%' ?escape '/' 兩種斜杠 )

( PostgreSQL 只支持 like '/%%' ?escape '/' )
用戶輸入如果沒有任何限制的話,則必須對特殊字符進(jìn)行變換。
如果對單引號不進(jìn)行變換,則會發(fā)生數(shù)據(jù)庫錯(cuò)誤,甚至可能導(dǎo)致系統(tǒng)崩潰。 不過回避方法卻非常簡單,只要將單引號[']轉(zhuǎn)換成兩個(gè)單引號['']就可以了。
例:SELECT * FROM TBL WHERE COL = 'ABC''DEF';
模糊查詢的語句雖然不會發(fā)生SQL錯(cuò)誤,但是不進(jìn)行回避的話,則無法得到要檢索的值。 回避方法較單引號復(fù)雜。需要使用轉(zhuǎn)義符。將[%]轉(zhuǎn)為[\%]、[_]轉(zhuǎn)為[\_], 然后再加上[ESCAPE '\']就可以了。
例:SELECT * FROM TBL WHERE COL LIKE 'ABC\%\_%' ESCAPE '\';   ※最后一個(gè)%是通配符。
如果做日文項(xiàng)目的話,會出現(xiàn)全角字符的[%]、[_], 而這兩個(gè)全角字符同樣會作為半角通配符處理。 所以在變換時(shí),同時(shí)需要將全角的[%]、[_]進(jìn)行變換。
例:SELECT * FROM TBL WHERE COL LIKE 'ABC\%\_\%\_%' ESCAPE '\';
變換成這樣似乎結(jié)束了,可是不要忘了還有轉(zhuǎn)義符自身,萬一用戶輸入轉(zhuǎn)義符的話,
以上的處理就會發(fā)生SQL錯(cuò)誤。所以也必須對轉(zhuǎn)義符進(jìn)行變換。變換方法就是將[\]轉(zhuǎn)換為[\\]。

例:SELECT * FROM TBL WHERE COL LIKE 'ABC\%\_\%\\\_%' ESCAPE '\';
以上的操作都針對于一般的數(shù)據(jù)類型,如CHAR、VARCHAR2。 如果出現(xiàn)NCHAR、NVARCHAR2的話,以上的處理就會出現(xiàn)ORA-01425錯(cuò)誤。 如果改成以下寫法,則會發(fā)生ORA-01424錯(cuò)誤。
SELECT * FROM TBL WHERE COL LIKE '%\_%' ESCAPE TO_NCHAR('\')
正確的寫法應(yīng)該是
SELECT * FROM TBL WHERE COL LIKEC '%\_%' ESCAPE TO_NCHAR('\')
最后要說明的是每個(gè)like都應(yīng)該寫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行。


其中包含特殊的字符分別為%,_,&,有可能包含這些字符的數(shù)據(jù)含有錯(cuò)誤,或者需要查找包含這些字符的數(shù)據(jù)。


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

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

轉(zhuǎn)義字符為' '(空格);

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

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

轉(zhuǎn)義字符為'\';


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

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

轉(zhuǎn)義字符為'=';

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

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

轉(zhuǎn)義字符為'/';

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

未選定行

轉(zhuǎn)義字符為d,沒有實(shí)現(xiàn)轉(zhuǎn)義功能;

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

但是'&'不能通過轉(zhuǎn)義字符查找:

SQL> select * from test where test like '%\&%' escape'\';
select * from test where test like '%\&%' escape'\'
*
第 1 行出現(xiàn)錯(cuò)誤:
ORA-01424: 轉(zhuǎn)義符之后字符缺失或非法

可以通過另外的方式進(jìn)行轉(zhuǎn)義:

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

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

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

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

'''的轉(zhuǎn)義:

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

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

特殊符號的數(shù)據(jù)的插入

SQL> insert into test values('test&test');
輸入 test 的值: test
原值 1: insert into test values('test&test')
新值 1: insert into test values('testtest') -雖然插入,但是數(shù)據(jù)不對。

已創(chuàng)建 1 行。

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

已創(chuàng)建 1 行。

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

已創(chuàng)建 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');

已創(chuàng)建 1 行。

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

已創(chuàng)建 1 行。

SQL> insert into test values('test\'test);
insert into test values('test'test)
*
第 1 行出現(xiàn)錯(cuò)誤:
ORA-00917: 缺失逗號


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

已創(chuàng)建 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行。

連接符‘||’導(dǎo)致了新一輪的轉(zhuǎn)義:連接符號‘||’左右的單引號沒有任何的關(guān)系,除非‘||’是作為字符串的一部分(這在動態(tài)SQL中很常見)。

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

'ORACLE'||''
----------
ORACLE'
個(gè)人理解,'ORACLE'||'''' 后面的“''''”應(yīng)該認(rèn)為是一個(gè)字符串(即前后單引號,中間是“''”串,而中間又是密集單引號,因此第一個(gè)為轉(zhuǎn)義功能)
SQL> SELECT 'ORACLE''''' FROM DUAL;

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


對于第一個(gè),前兩個(gè)單引號配對,后面四個(gè)單引號按照上面的第一條原則分配,既:SELECT 'ORACLE'||'''' FROM DUAL;
對于第二個(gè),由于第二個(gè)單引號后面存在單引號,所以就不與第一個(gè)配對,而是充當(dāng)了轉(zhuǎn)義的角色。既:SELECT 'ORACLE''''' FROM DUAL;

注:本人引用了網(wǎng)友的資源,如侵犯了您的版權(quán),請告知,我會立即修改指明出處

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的SQL模糊查询语句和Escape转义字符的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。