【问题标题】:Oracle Regexp_ help to do a replace on stringOracle Regexp_ 帮助对字符串进行替换
【发布时间】:2017-06-25 01:45:50
【问题描述】:

我有一个字段,其中包含多个由$; 分隔的名称值,如下所示:

$;James$;Paul$;

我在名称上有一个可用的功能,可以让我识别来自不同表的数据,即电子邮件地址。 但是,该函数仅适用于单个名称值。 所以我需要做一个子字符串来获取每个名称值,然后运行一个替换命令来运行该函数来提取他们的电子邮件地址。 我想得到以下回复 James@emailserver.com, Paul@emailserver.com。

所以我的问题是:如何运行 regexp_replace 命令来识别名称,然后将它们拆分以运行替换?

【问题讨论】:

    标签: sql regex oracle regexp-replace


    【解决方案1】:

    类似这样的:

    with
         name_list ( id, str ) as (
           select 1, '$;James$;Paul$;'      from dual union all
           select 2, '$;Jane$;Emily$;Ann$;' from dual
         )
    select id, substr(str, instr(str, '$;', 1, level) + 2,
                  instr(str, '$;', 1, level+1) - instr(str, '$;', 1, level) - 2) as name
    from   name_list
    connect by level <= regexp_count(str, '\$;') - 1
           and prior id = id
           and prior sys_guid() is not null
    ;
    
    ID   NAME
    --   -----
     1   James
     1   Paul
     2   Jane
     2   Emily
     2   Ann
    

    然后您可以使用它进行比较。

    或者,如果您需要查看名称James 是否在您的输入字符串中(并假设Jamesname_col 列中的值):

    ... where name_list.str like '$;' || name_col || '$;'
    

    并且您不再需要拆分字符串。但是,串联是必要的,因为您不希望名称列表中的 Anne 与列中的名称 Ann 匹配。

    【讨论】:

      【解决方案2】:

      这个函数可以帮助我拆分一个 varchar:

      function f_split_string( p_string varchar2, p_separator varchar2, p_pos number) return varchar2
      is
      v_string varchar2(100);
      begin
           select partition into v_string from
               (select rownum as n , partition from
                   (select regexp_substr(p_string, '[^'||p_separator||']+', 1, level) partition from dual
                   connect by regexp_substr(p_string, '[^'||p_separator||']+', 1, level) is not null)
               ) t1
           where t1.n = p_pos;
      
           return trim(v_string);
      exception
          when others then return 'nfound';
      end;
      

      调用示例:

      /*using the params*/
      p_string := '$;James$;Paul$;'; --string to parse
      p_separator := '$;'; --separator
      p_pos := 1; --position to get
      f_split_string(p_string,p_separator,p_pos) /*return 'James'*/
      
      /*if p_pos :=2*/
      f_split_string(p_string,p_separator,p_pos) /* return 'Paul' */
      
      /*if p_pos :=3*/
      f_split_string(p_string,p_separator,p_pos) /*return 'nfound' */
      
      /*if p_pos :=0*/
      f_split_string(p_string,p_separator,p_pos) /* return 'nfound' */
      

      【讨论】:

      • 恐怕您的解决方案不处理 NULL 列表元素,如果遇到将返回错误数据。给它'$;James$;$;Paul$;George' 并要求获得第三名。使用正则表达式'[^,]+'(常见的)是危险的。 stackoverflow.com/a/31464699/2543416
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-01
      相关资源
      最近更新 更多