0

我在 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;
4

2 回答 2

0

试试这个(你可以使用任何类似*, ^, #etc的字符,,除非你期望你的任何字符串包含,作为实际值):

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);
于 2013-04-23T02:55:39.783 回答
0

尝试这个,

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)
于 2013-04-23T06:08:38.340 回答