【问题标题】:Remove a character from a given position on Oracle从 Oracle 的给定位置删除一个字符
【发布时间】:2011-02-24 09:08:17
【问题描述】:

是否有从给定位置删除字符的方法?

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

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

想法?

【问题讨论】:

    标签: oracle string replace substring


    【解决方案1】:

    是的 REPLACE 和 SUBSTR 按正确的顺序就可以了。

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

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

    【讨论】:

    • 一个例子非常感谢。
    【解决方案2】:

    例子:

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

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

    参考资料:

    【讨论】:

    【解决方案3】:

    您应该强烈考虑使用regexp_replace。它更短,也没有乍一看那么复杂:

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

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

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

    熟悉正则表达式对程序员或任何类型的 IT 专家都有好处,因为它赋予了他或她处理文本条目的强大能力。

    【讨论】:

      【解决方案4】:

      或者使用 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;
      

      【讨论】:

        【解决方案5】:

        你可以在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;
        

        【讨论】:

          猜你喜欢
          • 2020-07-19
          • 2012-05-02
          • 1970-01-01
          • 2015-02-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-09-01
          • 1970-01-01
          相关资源
          最近更新 更多