【问题标题】:Converting a string (delimited by consecutive delimiters) to rows using Oracle regular expression使用 Oracle 正则表达式将字符串(由连续分隔符分隔)转换为行
【发布时间】:2013-04-24 02:02:36
【问题描述】:

我在 Oracle 中有一个由连续分隔符波浪号 (~) 分隔的通用字符串。例如字符串是'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;

【问题讨论】:

  • 您有前瞻功能吗?例如您可以执行正则表达式 '1 或多个前瞻 ~~ 失败的任何字符'

标签: oracle


【解决方案1】:

试试这个(如果你希望你的任何字符串包含,作为实际值,你可以使用*, ^, #等除,之外的任何字符):

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;

您还可以将 XML 与 oracle 一起使用

WITH CTE AS (SELECT '"' 
             || REPLACE('apple~orange~~mango~~grapes','~~','","') 
             || '"' STR FROM DUAL)
select column_value str from cte, xmltable(str);

【讨论】:

  • 感谢您的回复,但分隔符不能少于两个字符,即 ~~,我们不能将其替换为其他字符。如果分隔符可以是单个字符,那么我在查询中包含的 sql 可能有效。这是因为数据可以包含任何字符,并确保没有分隔符作为数据我使用两个字符分隔符。
  • @user2309418,您是否 100% 确定您的数据本身不会包含两个分隔字符?
【解决方案2】:

试试这个,

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)

【讨论】:

  • 感谢您的回复,但是您粘贴的sql已经试过了。如果您看到我的原始问题,我使用的 sql 与您提供的几乎相同。我面临的唯一问题是它没有根据两个字符分隔符返回正确的输出。
  • 我已经修改了答案,你可以检查一下吗?
  • 您好,我已经验证了,但仍然没有成功。
猜你喜欢
  • 1970-01-01
  • 2010-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多