2010-05-26 55 views
2

無論如何刪除給定位置的字符?從Oracle的指定位置移除一個字符

比方說,我的話是: PANCAKES 我想刪除第二個字母(在這種情況下,「A」),所以我想作爲PNCAKES我的回報。

Translate對此無法正常工作。 替換沒有爲此工作。 正則表達式是該死的複雜...

想法?

回答

4

例子:

SUBSTR('PANCAKES', 0, INSTR('PANCAKES', 'A', 1, 1)-1) || SUBSTR('PANCAKES', INSTR('PANCAKES', 'A', 1, 1)+1) 

我沒有一個Oracle實例來進行測試,可能需要調整-1/+ 1得到正確的位置。

參考文獻:

+0

REGEXP_REPLACE是Oracle 10g +的一個選項:http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/functions130.htm#SQLRF06302 – 2010-05-26 20:35:56

+0

Works。謝謝!我在考慮正則表達式,但它們有點複雜。 – alex 2010-05-26 20:44:24

+0

@alex:我強烈建議http://www.regular-expressions.info/ - 這是一個很好的資源,讓正則表達式更加舒適。 – 2010-05-26 20:46:09

0

yes按照正確的順序更換和SUBSTR將執行此操作。

最終結果應該是在char之後將刪除的char之前的SUBSTR連接到SUBSTR。

如果整列只有一個單詞,那麼你可以做一個更新,如果單詞在另一個字符串中,那麼你可以使用REPLACE作爲包裝。

+0

一個例子是非常讚賞。 – alex 2010-05-26 20:29:13

3

你應當認真考慮使用regexp_replace。它是較短的,不那麼複雜,因爲它似乎在乍一看:

SELECT REGEXP_REPLACE(S, '^(.{1}).', '\1') 
FROM (
    SELECT 'PANCAKES' 
    FROM DUAL 
) 

爲恰好隨後的可印刷或uprintable字符中的一個(.{1})的圖案從字符串(由^表示)的開始^(.{1}).搜索再次只是其中的一個字符(.)。 「精確」部分在括號中關閉,因此可以通過第三個函數參數(\1)中的數字將其引用爲匹配組。因此,正則表達式匹配的整個子字符串是'PA',但我們只引用'P'。字符串的其餘部分保持不變。所以結果是'PNCAKES'。

如果要從字符串中刪除第N個字符,只需將該模式(用於刪除第二個字符)中的數字'1'替換爲值N-1。

對於程序員或任何類型的IT專業人員來說,熟悉正則表達式是很好的,因爲它爲他或她提供了很多使用文本輸入的功能。

1

或者使用SUBSTR自定義的SplitAtPos函數。好處是它仍然可以在Oracle v9上運行。

set serveroutput on 
declare 

s1 varchar2(1000); 
s2 varchar2(1000); 

function SplitAtPos(s in out varchar2, idx pls_integer) 
    return varchar2 
is 
    s2 varchar2(1000); 
begin 
    s2:=substr(s,1,idx-1); 
    s:=substr(s,idx,length(s)-idx+1); 
    return s2; 
end; 

begin 
s1:='Test123'; 
s2:=SplitAtPos(s1,1); 
dbms_output.put_line('s1='||s1||' s2='||s2); 

s1:='Test123'; 
s2:=SplitAtPos(s1,5); 
dbms_output.put_line('s1='||s1||' s2='||s2); 

s1:='Test123'; 
s2:=SplitAtPos(s1,7); 
dbms_output.put_line('s1='||s1||' s2='||s2); 

s1:='Test123'; 
s2:=SplitAtPos(s1,8); 
dbms_output.put_line('s1='||s1||' s2='||s2); 

s1:='Test123'; 
s2:=SplitAtPos(s1,0); 
dbms_output.put_line('s1='||s1||' s2='||s2); 

end; 
0

您可以使用這樣的事情在pl/SQL

DECLARE 
    v_open NUMBER; 
    v_string1 VARCHAR2(10); 
    v_string2 VARCHAR2(10); 
    v_word VARCHAR2(10); 
BEGIN 
    v_open := INSTR('PANCAKES' ,'A',1); 
    v_string1 := SUBSTR('PANCAKES' ,1, 1); 
    v_string2 := SUBSTR('PANCAKES' ,v_open+1); 
    v_word := v_string1||v_string2; 
END; 
+0

請詳細解釋你的代碼。 – 2015-01-23 18:15:52

相關問題