字符串like匹配遇到關鍵字,字符轉義問題
在使用like匹配字符串的時候,如果字符串中有%、下劃線、單引號等sql語法中保留字符串,這時候需要轉義,mysql中保持和linux或某些編程語言中一致,使用反斜槓“\”來解決,Oracle中則稍顯麻煩。
前面說過,在字符串拼接時遇到關鍵字可用quote(q)方法來搞定,但在where條件的like匹配中,就需要使用escape來搞定。
escape用法說明:
1)使用 ESCAPE 關鍵字定義轉義符。在模式中,當轉義符置於通配符之前時,該通配符就解釋爲普通字符。
2)ESCAPE 'escape_character’允許在字符串中搜索通配符而不是將其作爲通配符使用。escape_character 是放在通配符前表示此特殊用途的字符。
造測試數據
set define off
create table test (c_text varchar2(20));
insert into test(c_text) values ('sdd_kk');
insert into test(c_text) values ('d''d');
insert into test(c_text) values ('dfsfsa');
insert into test(c_text) values ('dffa%asfs');
insert into test(c_text) values ('12345');
insert into test(c_text) values ('1%2345');
insert into test(c_text) values ('1%54321');
insert into test(c_text) values ('2%54321');
insert into test(c_text) values ('%%54321');
insert into test(c_text) values ('A&B');
commit;
set define on
輸出結果:
SYS@orcl11g>select * from test;
C_TEXT
--------------------
sdd_kk
d'd
dfsfsa
dffa%asfs
12345
1%2345
1%54321
2%54321
%%54321
A&B
10 rows selected.
- 如何插入帶單引號的值,比如:d’d
oracle中使用insert into test(c_text) values (‘d’‘d’);
mysql中使用insert into test(c_text) values (‘d\d’);
- 如何插入“&”這個字符,比如:A&B
方法一: 通用,推薦
SYS@orcl11g>select ascii('&') from dual;
ASCII('&')
----------
38
SYS@orcl11g>insert into test(c_text) values (chr(38));
1 row created.
SYS@orcl11g>select * from test where c_text like '%'||chr(38)||'%';
C_TEXT
--------------------
A&B
&
方法二: 在sqlplus中關閉“&”字符特殊含義的定義
SQL> show define
define "&" (hex 26)
SQL> set define off
SQL> show define
define OFF
SQL> insert into test values('test&test');
轉義字符例子
- 轉義字符爲’ '(空格);
SYS@orcl11g>select * from test where c_text like 'sdd _%' escape ' ';
C_TEXT
--------------------
sdd_kk
- 轉義字符爲’’
SYS@orcl11g>select * from test where c_text like 'sdd\_%' escape '\';
C_TEXT
--------------------
sdd_kk
- 轉義字符爲’=’
SYS@orcl11g> select * from test where c_text like 'sdd=_%' escape '=';
C_TEXT
--------------------
sdd_kk
- 轉義字符爲’/’
SYS@orcl11g> select * from test where c_text like 'sdd/_%' escape '/';
C_TEXT
--------------------
sdd_kk
- 轉義字符爲d,沒有實現轉義功能,其他不包含在條件中的字母可以
SYS@orcl11g>select * from test where c_text like 'sddd_%' escape 'd';
no rows selected
SYS@orcl11g>select * from test where c_text like 'sddc_%' escape 'c';
C_TEXT
--------------------
sdd_kk
SYS@orcl11g>select * from test where c_text like 'sdds_%' escape 's';
select * from test where c_text like 'sdds_%' escape 's'
*
ERROR at line 1:
ORA-01424: missing or illegal character following the escape character
查詢包含語法關鍵字的字段值
- 查找包含所有’_'的字段
SYS@orcl11g>select * from test where c_text like '%\_%' escape '\';
C_TEXT
--------------------
sdd_kk
- 查找含有’%'的所有值
SYS@orcl11g>select * from test where c_text like '%\%%' escape '\';
C_TEXT
--------------------
dffa%asfs
1%2345
1%54321
2%54321
%%54321
- 查詢包含“&”字符的內容
如果直接使用上面介紹的方法會報錯:
SYS@orcl11g>select * from test where c_text like '%\&%' escape'\';
select * from test where c_text like '%\&%' escape'\'
*
ERROR at line 1:
ORA-01424: missing or illegal character following the escape character
使用對應的ASCII碼去匹配纔可以:
SYS@orcl11g> select * from test where c_text like '%'||chr(38)||'%';
C_TEXT
--------------------
A&B
- 查找含有單引號的值
SYS@orcl11g>select * from test where c_text like '%''%';
C_TEXT
--------------------
d'd
- 有關單引號的特殊情況
情況一:
SYS@orcl11g>SELECT 'ORACLE'||'''' FROM DUAL;
'ORACLE
-------
ORACLE'
情況二:
SYS@orcl11g>SELECT 'ORACLE''''' FROM DUAL;
'ORACLE'
--------
ORACLE''
對於情況一,前兩個單引號配對,後面四個單引號表示單引號這個字符串。
對於情況二,總共6個單引號,第1、6單引號表示字符串表達用的開頭結尾單引號,第2個單引號表示轉義符號(因轉義犧牲掉),第3個單引號表達出原值(保留),第4個單引號也表示轉義,第5個單引號表達出原值。所以,最後結果出現兩個單引號。
對比’ORACLE’||’’’'的情況,Oracle字符串在使用||拼接的時候,||前後都是一個字符串,寫sql的時候要特別注意。
字符拼接問題
方法一:推薦
一般在拼接字符串時,‘A’||'B’簡單情況是可以的,但是如果包含單引號這樣的關鍵字就會報語法錯誤了,使用Quote(q)語法就可以搞定,好處如下:
a.指定自己的引號分隔符
b.可選擇任意方便的分隔符,單字節或多字節,或者下列符號: [ ], { }, ( ), < >。
c.增加可讀性和可用性
舉例:
SQL> select department_name || q'[, it's assigned Manager Id: ]' || manager_id as "Department and Manager" from departments;
Department and Manager
-----------------------------------------------------------------------
Administration, it's assigned Manager Id: 200
Marketing, it's assigned Manager Id: 201
Purchasing, it's assigned Manager Id: 114
方法二: 處理單引號
由於單引號是匹配字符串的關鍵字符,所以oracle中使用兩個單引號來表示。字符串兩端又需要單引號,最終,爲了輸入一個單引號,需要4個單引號來完成,即:’’’’ ,這也就是爲啥使用quote(q)方便的原因。
SYS@orcl11g>select '''' as danyinhao from dual;
D
-
'