oracle中的單引號和雙豎線||以及q'間隔符


單引號在 Oracle 中有三種身份:

      1. 用來引用一個字符串常量,也就是界定一個字符串的開始和結束
      2. 轉義符,對緊隨其后出現的字符(單引號)進行轉義
     3. 表示它本身,也就是它作為一個字符串的一部分而出現在一個字符串常量中

當具有不同身份的單引號緊挨着一起出現在 sql 語句中時常常令人迷惑不解,下面我將以自己總結出來的經驗為基礎,結合具體實例來告訴大家如何弄清每個單引號的含義。

總結經驗:
1. 出現在表達式開頭和結尾的這兩個單引號的含義肯定是表示引用一個字符串,界定字符串的開始和結束
2. 如果單引號出現在表達式中間(即非表達式開頭和結尾的單引號),且多個單引號之間沒有任何其他字符,那么當我們從左向右分析時,第一對單引號中的第一個是轉義符,它對緊隨其后的第二個單引號進行轉義,以使第二個單引號作為一個字符出現在一個字符串常量中。第二隊,第三隊,以此類推......

下面用實例來驗證自己的經驗總結:

示例一:

 

select '''' from dual;

result '

上圖中,表達式 '''' 中第1、4個單引號表示引用一個字符串常量,表達式的剩余部分我們從左往右分析,由於中間是一對單引號,故此對中的第一個是轉義符,其對第二個進行轉義,使第二個表示單引號本身。分析得出這里有一個字符串常量,其中只有一個單引號字符。sql 語句的運行結果與我們的分析結果一致。

 

示例二:

select 'exit''''' from dual

result exit''

 上圖中,表達式 'exit''''' 中第一個和最后一個單引號表示引用一個字符串常量,表達式的剩余部分我們依然從左往右分析。剩余部分中,遇到的第一個單引號后面緊隨一個單引號,我們將其作為一對,根據示例一,這一對的解析結果為一個單引號字符本身;然后繼續向右走,又遇到一對緊挨着的單引號,同理,他們的解析結果也是一個單引號字符本身。分析得出這里的字符串常量包含exit和兩個單引號字符。sql 語句的運行結果與我們的分析結果一致。

###########################################################

||雙豎線表示連接字符串

select 'SET NEWNAME FOR DATAFILE '|| file# ||' to ' ||''''|| name ||''''|| ';' from v$datafile;
查詢結果例子:SET NEWNAME FOR DATAFILE 1 to '+DATA/HADB/DATAFILE/system.316.1018842199';

 

在轉義特殊字符的時候通常使用的就是單引號。但這種轉義方式很不直觀。在oracle中使用q' 來對特殊字符進行轉義。q'轉義符通常后面使用!  []   {}  ()  <>等轉義符號(成雙的),也可以使用\ ,也可以用字母、數字、=、+、-、*、&、$、%、#等,不可以使用空格

SQL> select q'8is good d8' from dual;

Q'8ISGOOD
---------
is good d

###############################################

示例三:select 'alter database rename file '''||member||q'[' to '/u01/app/oracle/fast_recovery_area/redo';]' from v$logfile;

查詢結果例子:alter database rename file '+DATA/HADB/ONLINELOG/group_4.285.1018847393' to '/u01/app/oracle/fast_recovery_area/redo1';

示例三解析:遇到第一個||之前,解析 'alter database rename file ' 為 alter database rename file,第三個單引號是轉義符,把第四個單引號轉化為本身即單引號,第二個雙豎線||之后的 q' 開始表示使用它來規定某些自定義的轉義符,這里轉義符是 [] 中括號,然后

第一個左中括號把單引號轉義為單引號及空格,最后的右中括號]是兜底。其實轉義的一整塊是   q'[' to '/u01/app/oracle/fast_recovery_area/redo';]' 


免責聲明!

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



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