【问题标题】:Insert character between string Oracle SQL在字符串 Oracle SQL 之间插入字符
【发布时间】:2023-04-17 15:30:02
【问题描述】:

我需要在 Oracle SQL 中的每个字符之后插入字符串。

例子:

ABC  will A,B,C

DEFG will be D,E,F,G

这个问题只给出字符串中的一个字符

Oracle insert character into a string

【问题讨论】:

    标签: sql oracle oracle11g


    【解决方案1】:

    编辑:正如一些人提到的,Oracle 不承认这个正则表达式。所以我的方法是做一个正则表达式来匹配所有字符,在字符后面添加一个逗号,然后删除最后一个逗号。

    WITH regex AS (SELECT REGEXP_REPLACE('ABC', '(.)', '\1,') as reg FROM dual) SELECT SUBSTR(reg, 1, length(reg)-1) FROM regex;
    

    请注意,使用rtrim 的解决方案,如果您要解析的字符串有一个结尾逗号并且您不想删除它,则可能会出现错误。

    以前的解决方案:(不适用于 Oracle)

    检查这是否有效:

    SELECT REGEXP_REPLACE('ABC', '(.)(?!$)', '\1,') FROM dual;
    

    它对每个字符执行regexp_replace,但最后一个用于同一字符,后跟一个,

    要了解regexp_replace 的工作原理,我推荐您:https://docs.oracle.com/cd/B19306_01/server.102/b14200/functions130.htm

    【讨论】:

    • Oracle 不支持 Lookahead 和 Lookbehind。
    【解决方案2】:

    SELECT rtrim(REGEXP_REPLACE('ABC', '(.)', '\1,'),',') "REGEXP_REPLACE" FROM dual;

    【讨论】:

      【解决方案3】:

      你可以这样做:

      • REGEXP_REPLACE
      • RTRIM

      例如,

      SQL> WITH sample_data AS(
        2  SELECT 'ABC' str FROM dual UNION ALL
        3  SELECT 'DEFG' str FROM dual UNION ALL
        4  SELECT 'XYZ' str FROM dual
        5  )
        6  -- end of sample_data mimicking a real table
        7  SELECT str,
        8    rtrim(regexp_replace(str, '(\w?)', '\1,'),',') new_str
        9  FROM sample_data;
      
      STR  NEW_STR
      ---- ----------
      ABC  A,B,C
      DEFG D,E,F,G
      XYZ  X,Y,Z
      

      【讨论】:

      • 为什么我们需要正则表达式模式中的(1)?
      【解决方案4】:

      由于没有办法在 Oracle 正则表达式中否定字符串的结尾(不支持环视),您可以使用

      SELECT REGEXP_REPLACE(
          REGEXP_REPLACE('ABC', '([^,])([^,])','\1,\2'),
          '([^,])([^,])',
          '\1,\2')
          AS Result from dual
      

      请参阅DB Fiddle。这里的重点是使用REGEXP_REPLACE([^,])([^,]) 模式两次 来满足连续匹配。

      ([^,])([^,]) 模式将任何非逗号字符匹配到第 1 组 (\1),然后将任何非逗号字符匹配到第 2 组 (\2),并在它们之间插入逗号。

      【讨论】:

        最近更新 更多