通配符描述示例%包含零個或更多字符的任意字符串。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'_nLIKE '[a-cdf]'a、b、c、d 或 fLIKE '[-acdf]'-、a、c、d 或 fLIKE '[ [ ]'[LIKE ']']LIKE 'abc[_]d%'abc_d 和 abc_deLIKE 'abc[def]'abcd、abce 和 abcfSQL模糊查詢,使用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 '/';
以上的操作都針對於一般的數據類型,如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;
注:本人引用了網友的資源,如侵犯了您的版權,請告知,我會立即修改指明出處!
