单引号在 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';]' 

01-25 13:25