無論如何刪除給定位置的字符?從Oracle的指定位置移除一個字符
比方說,我的話是: PANCAKES 我想刪除第二個字母(在這種情況下,「A」),所以我想作爲PNCAKES我的回報。
Translate對此無法正常工作。 替換沒有爲此工作。 正則表達式是該死的複雜...
想法?
無論如何刪除給定位置的字符?從Oracle的指定位置移除一個字符
比方說,我的話是: PANCAKES 我想刪除第二個字母(在這種情況下,「A」),所以我想作爲PNCAKES我的回報。
Translate對此無法正常工作。 替換沒有爲此工作。 正則表達式是該死的複雜...
想法?
例子:
SUBSTR('PANCAKES', 0, INSTR('PANCAKES', 'A', 1, 1)-1) || SUBSTR('PANCAKES', INSTR('PANCAKES', 'A', 1, 1)+1)
我沒有一個Oracle實例來進行測試,可能需要調整-1/+ 1得到正確的位置。
參考文獻:
yes按照正確的順序更換和SUBSTR將執行此操作。
最終結果應該是在char之後將刪除的char之前的SUBSTR連接到SUBSTR。
如果整列只有一個單詞,那麼你可以做一個更新,如果單詞在另一個字符串中,那麼你可以使用REPLACE作爲包裝。
一個例子是非常讚賞。 – alex 2010-05-26 20:29:13
你應當認真考慮使用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專業人員來說,熟悉正則表達式是很好的,因爲它爲他或她提供了很多使用文本輸入的功能。
或者使用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;
您可以使用這樣的事情在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;
請詳細解釋你的代碼。 – 2015-01-23 18:15:52
REGEXP_REPLACE是Oracle 10g +的一個選項:http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/functions130.htm#SQLRF06302 – 2010-05-26 20:35:56
Works。謝謝!我在考慮正則表達式,但它們有點複雜。 – alex 2010-05-26 20:44:24
@alex:我強烈建議http://www.regular-expressions.info/ - 這是一個很好的資源,讓正則表達式更加舒適。 – 2010-05-26 20:46:09