一位同事在使用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