TL; DR:set define off
運行查詢(可能)前。
句點(.
)不是特殊字符。你分割和連接值的方式讓我懷疑你是否因爲&
而在SQL * Plus或SQL Developer(或可能是其他客戶端)中看到substitution variable問題,而這又可以使.
似乎消失 - 雖然不是在你的具體情況。
的時段可以標記一個替換變量的端部,並且需要如果下一個字符是字符串的一部分,因此,如果你有:
select 'R&Ddept' from dual;
那麼整個「Ddept」將被視爲替代變量:
Enter value for ddept: D
old 1: select 'R&Ddept' from dual
new 1: select 'RD' from dual
'R
--
RD
爲了使剛剛D
是替代變量,並留下「部門」作爲一個固定的字符串,分隔該變量用了一段:
select 'R&D.dept' from dual;
Enter value for d: D
old 1: select 'R&D.dept' from dual
new 1: select 'RDdept' from dual
'RDDEP
------
RDdept
但是,如果你想有一個時期實際上被顯示出來,你需要添加額外的一個,以考慮一個由替代處理誤服:
select 'R&D..dept' from dual;
Enter value for d: D
old 1: select 'R&D..dept' from dual
new 1: select 'RD.dept' from dual
'RD.DEP
-------
RD.dept
顯然,這僅適用,如果你真的想要替換,當然&
不會出現在任何這些情況下的最終字符串中。在你的情況下更容易混淆(對我來說),&
和.
之間的空格意味着它不被視爲分隔符;對於'ATTRIBUTE_TYPE.R&D GMD NO.'
,只有&D
被視爲替代,並且.
保持原樣。我是猜測你得到了這一點與較短的價值。
你可能想在這裏實現的是完全避免替換。你這樣做的方式,分開字符串,以便自己看到&
,並且沒有看到替換,肯定是一種方式,但是很痛苦,特別是如果你不一定控制正在使用的字符串或有多個值。
至少有兩種方法;與set escape
和set define
:
set escape '\'
select 'ATTRIBUTE_TYPE.R\&D GMD NO.' from dual;
這定義了SQL * Plus會話轉義字符,然後你可以把這個角色的符號之前 - \&
- 因此它不被視爲一個替代變量。但是你仍然需要修改你的原始字符串,這並不理想。
set define off
select 'ATTRIBUTE_TYPE.R&D GMD NO.' from dual;
這將完全禁用替換,因此原始字符串保持不變。這是最簡單的方法。您可以根據需要在腳本中將其打開和關閉;如果你有一個單獨的語句需要在某些地方進行替換,但也有你希望保留的&符號,你可以恢復到轉義機制,或者定義一個不同的替代字符,只要你能找到別的東西你永遠不需要逃離。
(您也可能會看到參考set scan off
;這比set define
和is obsolete更早,所以不要在新代碼中使用它)。
符號'||'用於連接字符串。所以你的要求是選擇具有'name_display_code ='ATTRIBUTE_TYPE.R&D GMD NO.''的行? – TechDo 2013-04-05 06:21:54
引用字符串中的點並不特殊。你目前的查詢有什麼問題? – 2013-04-05 07:12:56
嘗試'name_display_code ='ATTRIBUTE_TYPE.R&'||'D GMD NO.'' – 2013-04-05 08:00:57