2013-04-05 37 views
0

我有一個要求,以拉列值包含特殊符號('.')。如何獲得包含特殊符號的值在哪裏條款

我寫的代碼像下面

SELECT value, name_display_code 
       FROM vp40.ATTRIBUTES 
      WHERE attribute_type_id IN (
         SELECT attribute_type_id 
         FROM vp40.attribute_types 
         WHERE name_display_code = 
            'ATTRIBUTE_TYPE.R' 
           || '&' 
           || 'D GMD NO'||'.') 

我需要值爲ATTRIBUTE_TYPE.R&D GMD NO.

+0

符號'||'用於連接字符串。所以你的要求是選擇具有'name_display_code ='ATTRIBUTE_TYPE.R&D GMD NO.''的行? – TechDo 2013-04-05 06:21:54

+1

引用字符串中的點並不特殊。你目前的查詢有什麼問題? – 2013-04-05 07:12:56

+0

嘗試'name_display_code ='ATTRIBUTE_TYPE.R&'||'D GMD NO.'' – 2013-04-05 08:00:57

回答

3

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 escapeset 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 defineis obsolete更早,所以不要在新代碼中使用它)。

+0

感謝alex的解釋。我知道了 – ravt 2013-04-05 10:45:42