从Oracle上的给定位置删除字符

时间:2010-05-26 20:23:14

标签: oracle string replace substring

无论如何都要删除给定位置的角色?

我们说的是: 薄煎饼 我想删除第二个字母(在这种情况下,'A'),所以我希望PNCAKES作为我的回报。

翻译不适用于此。 替换不起作用。 正则表达式很复杂......

想法?

5 个答案:

答案 0 :(得分:4)

示例:

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

我没有要测试的Oracle实例,可能需要调整-1 / + 1以获得正确的位置。

参考文献:

答案 1 :(得分:3)

您应该强烈考虑使用regexp_replace。它更短,并不像第一眼看上去那么复杂:

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

模式^(.{1}).从字符串的开头(由^表示)搜索正好一个(.{1})可打印或可升级字符,然后再搜索其中一个字符( .)。 “精确”部分在括号中闭合,因此可以通过第三个函数的参数(\1)中的数字引用它作为匹配组。所以regexp匹配的整个子串是'PA',但我们只引用'P'。弦的其余部分保持不变。所以结果是'PNCAKES'。

如果要从字符串中删除第N个字符,只需将模式中的数字“1”替换为(用于删除第二个字符),其值为N-1。

程序员或任何类型的IT专家都可以熟悉正则表达式,因为它可以让他或她有很多权力处理文本条目。

答案 2 :(得分: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;

答案 3 :(得分:0)

是按正确的顺序REPLACE和SUBSTR可以解决问题。

最终结果应该是删除char之前的SUBSTR与char之后的SUBSTR的串联。

如果整个列只有一个单词,那么你可以只进行更新,如果单词在另一个字符串中,那么你可以使用REPLACE作为包装。

答案 4 :(得分: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;