使用Oracle正则表达式将字符串(由连续分隔符分隔)转换为行

使用Oracle正则表达式将字符串(由连续分隔符分隔)转换为行,oracle,Oracle,在Oracle中,我有一个由连续分隔符tilde~分隔的通用字符串。例如,字符串是“apple~ orange~~ mango~~ grapes”。需要将其转换为行,但需要注意的一点是分隔符是连续的波浪形而不是单个波浪形。输出应如下所示: 苹果橙 芒果 葡萄 解决方法已经使用instr和substr oracle函数完成,但我需要使用oracle正则表达式的更干净的解决方案。我已尝试使用以下查询,但未获得正确的解决方案: WITH str AS (SELECT 'apple~orange~~ma

在Oracle中,我有一个由连续分隔符tilde~分隔的通用字符串。例如,字符串是“apple~ orange~~ mango~~ grapes”。需要将其转换为行,但需要注意的一点是分隔符是连续的波浪形而不是单个波浪形。输出应如下所示:

苹果橙

芒果

葡萄

解决方法已经使用instr和substr oracle函数完成,但我需要使用oracle正则表达式的更干净的解决方案。我已尝试使用以下查询,但未获得正确的解决方案:

WITH str AS (SELECT 'apple~orange~~mango~~grapes' str FROM dual),
     cnt AS (SELECT LEVEL sno FROM dual CONNECT BY LEVEL < 5)
SELECT regexp_substr (str, '[^~]+', 1, sno) FROM str CROSS JOIN cnt;

尝试此方法,您可以使用诸如*、^等任何字符作为实际值,如果您希望字符串中的任何字符都包含:

WITH STR AS (SELECT REPLACE('apple~orange~~mango~~grapes','~~',',') STR FROM DUAL),
     CNT AS (SELECT LEVEL SNO FROM DUAL CONNECT BY LEVEL < 4)
SELECT REGEXP_SUBSTR (STR, '[^,]+', 1, SNO) FROM STR CROSS JOIN CNT;
试试这个

select 
          t.str
         , regexp_substr (t.str, '[^~(?=~)]+', 1, rn) spl
    from YOURTABLE t
     cross
     join (select rownum rn
       from (select max (length (regexp_replace (t.str, '[^~~]+'))) + 1 mx
                     from YOURTABLE t
                  )
          connect by level <= mx
          )
   where regexp_substr (t.str,'[^~(?=~)]+' , 1, rn) is not null)

你有头像吗?e、 g.您可以使用正则表达式“1个或多个前瞻~~失败的任何字符”,感谢您的响应,但分隔符不能少于两个字符,即~~并且我们不能将其替换为其他字符。如果delimeter可以是单字符的,那么我在查询中包含的sql可能已经工作了。这是因为数据可以包含任何字符,并且为了确保没有分隔符作为数据提供,我正在使用两个字符分隔符。@user2309418,您是否100%确定数据本身不会包含两个分隔符?感谢您的响应,但您粘贴的sql已经过尝试。如果您看到我最初的问题,我使用的sql与您提供的几乎相同。我面临的唯一问题是它没有返回基于两个字符分隔符的正确输出。我已经修改了答案,请检查一下好吗?嗨,我已经验证了,但仍然没有成功。
select 
          t.str
         , regexp_substr (t.str, '[^~(?=~)]+', 1, rn) spl
    from YOURTABLE t
     cross
     join (select rownum rn
       from (select max (length (regexp_replace (t.str, '[^~~]+'))) + 1 mx
                     from YOURTABLE t
                  )
          connect by level <= mx
          )
   where regexp_substr (t.str,'[^~(?=~)]+' , 1, rn) is not null)