轉 SQL - 字符串中的轉義字符


一位同事在使用SQL處理一串字符時,出現一個意料之外的問題:這個字符串中包括字符‘&’。我們先看一下現象:
 
 
SQL> select * from v$version;
 
 
BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod
PL/SQL Release 10.2.0.1.0 - Production
CORE    10.2.0.1.0      Production
TNS for 32-bit Windows: Version 10.2.0.1.0 - Production
NLSRTL Version 10.2.0.1.0 - Production
 
SQL> select substr('asdf&yuechaotian', 1, 1) from dual;
輸入 yuechaotian 的值:
原值    1: select substr('asdf&yuechaotian', 1, 1) from dual
新值    1: select substr('asdf', 1, 1) from dual
 
 
S
-
a
 
因為這里的&提示后面的字符串是一個變量,提示我輸入子串yuechaotian的值。直接輸入回車后,這個字符串就變成'asdf',進行substr操作。比如此時我取第5個字符,就會返回null了:
 
 
SQL> select substr('asdf&yuechaotian', 5, 1) from dual;
輸入 yuechaotian 的值:
原值    1: select substr('asdf&yuechaotian', 5, 1) from dual
新值    1: select substr('asdf', 5, 1) from dual
 
 
S
-
 
 
此時只要將字符‘&’轉義一下就好。轉義字符是由SQL*PLUS的參數escape來控制的:
 
 
-- 默認情況下,escape是關閉的
SQL> show escape
escape OFF
-- 打開escape,默認使用'\'作為轉義字符
SQL> set escape on
SQL> show escape
escape "\" (hex 5c)
-- 此時使用'\'將字符'&'轉義
SQL> select substr('asdf\&yuechaotian', 1, 1) from dual;
 
 
S
-
a
 
-- 轉義字符只是用來轉義,本身是不占字符位置的
SQL> select substr('asdf\&yuechaotian', 5, 1) from dual;
 
 
S
-
&
 
轉義字符只轉義它后面的一個字符:
 
 
-- 此時第一個'\'將第二個'\'轉義,&表示后面的子串yuechaotian是變量,不輸入任何值,得到子串'asdf\'
SQL> select substr('asdf\\&yuechaotian', 5, 1) from dual;
輸入 yuechaotian 的值:
原值    1: select substr('asdf\\&yuechaotian', 5, 1) from dual
新值    1: select substr('asdf\', 5, 1) from dual
 
 
S
-
\
 
 
-- 此時第一個'\'將第二個'\'轉義,第三個'\'將'&'轉義,得到子串'asdf\&yuechaotian'
SQL> select substr('asdf\\\&yuechaotian', 5, 1) from dual;
 
 
S
-
\
 
SQL> select substr('asdf\\\&yuechaotian', 5) from dual;
 
 
SUBSTR('ASDF\
-------------
\&yuechaotian
 
其實你也可以自己制定轉義字符,不一定要使用'\'。比如你的字符串里本身就有字符'\',你需要找一個特殊點的字符作為轉義字符:
 
 
SQL> set escape #
SQL> show escape
escape "#" (hex 23)
SQL> select substr('asdf\\\#&yuechaotian', 5) from dual;
 
 
SUBSTR('ASDF\\\
---------------
\\\&yuechaotian
 
 
http://blog.chinaunix.net/uid-298599-id-2443124.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM