單引號雙重角色——字符串引用與轉義
在ORACLE中,單引號有兩個做用,一是字符串是由單引號引用,二是轉義,開始學習時動態構成SQL時常常不解。單引號的使用是就近配對,即就近原則。而在單引號充當轉義角色時相對很差理解。
一、從第二個單引號開始被視爲轉義符,若是第二個單引號後面還有單引號(哪怕只有一個)。學習
SQL> SELECT '''' FROM DUAL;
''
--
'
爲了證明結果是被第二個單引號轉義的第三個單引號(既:SELECT '''' FROM DUAL;),咱們作以下兩個測試:
SQL> SELECT ''' FROM DUAL;
ERROR:
ORA-01756: 括號內的字符串沒有正確結束
相信你們對這樣的錯誤不陌生吧
SQL> SELECT 'SDLF FROM DUAL;
ERROR:
ORA-01756: 括號內的字符串沒有正確結束
測試
也就是說,當第二個單引號充當轉義角色,第三個單引號被轉義,(既:select '' ' from dual;)天然就缺乏與第一個單引號匹配的單引號了,出現了孤立的單引號
下面的兩個實驗就更加支持了上面的結論。
SQL> SELECT ' '' ' FROM DUAL;
''''
------
'
SQL> SELECT '' '' FROM DUAL;
SELECT '' '' FROM DUAL
*
ERROR 位於第 1 行:
ORA-00923: 未找到預期 FROM 關鍵字
對於第一個:SELECT ' '' ' FROM DUAL;
對於第二個:不存在轉義。
上面的這兩個實驗其實也是單引號轉義與非轉義的一個性質:轉義是密集的,也就是說,若是單引號出如今轉義的位置上,而該單引號後面緊跟(緊跟的定義爲:兩個單引號之間是零距離的)的不是單引號,這個時候單引號就不在充當轉義的角色,而是與它前面的配對。
二、鏈接符‘||’致使了新一輪的轉義:鏈接符號‘||’左右的單引號沒有任何的關係,除非‘||’是做爲字符串的一部分(這在動態SQL中很常見)。
spa
SQL> SELECT 'ORACLE'||'''' FROM DUAL;
'ORACLE'||''
----------
ORACLE'
我的理解,'ORACLE'||'''' 後面的「''''」應該認爲是一個字符串(即先後單引號,中間是「''」串,而中間又是密集單引號,所以第一個爲轉義功能)
SQL> SELECT 'ORACLE''''' FROM DUAL;
'ORACLE'''''
------------
ORACLE''
orm
對於第一個,前兩個單引號配對,後面四個單引號按照上面的第一條原則分配,既:SELECT 'ORACLE'||'''' FROM DUAL;
對於第二個,因爲第二個單引號後面存在單引號,因此就不與第一個配對,而是充當了轉義的角色。既:SELECT 'ORACLE''''' FROM DUAL;
有了上面的兩條原則,咱們就能夠從容的面對複雜的動態SQL了。字符串
Oracle 字符串鏈接單引號:it
1. 首尾單引號爲字符串識別標識,不作轉譯用select
2. 首尾單引號裏面若是出現的單引號,而且有多個,則相連兩個單引號轉譯爲一個字符串單引號引用