将数据拆分为长度,也可以通过Oracle中的分隔符拆分

时间:2016-01-12 17:08:20

标签: sql regex oracle11g

我需要根据以下规则分割字符串

规则1:分割长度为10 char的字符串。

规则2:如果分割字符串的长度大于10,则如果值大于10个字符的长度,则将该字符串除以最后分隔符(,)

Input 
Row1 - 01,234,456890,12,3456,7890123,12
Output
Row1 - 01,234,
Row2 - 456890,12,
Row3 - 3456,
Row4 - 7890123,12

我尝试过这个查询,但它被10个字符分割

SELECT distinct regexp_replace('01,234,456890,12,3456,7890123,12',
                                '(.{10})', '\1' || CHR(13) || CHR(10)) txt 
FROM dual 
CONNECT BY regexp_substr('01,234,456890,12,3456,7890123,12', 
                         '(.{10})', 1, LEVEL) IS NOT NULL 

1 个答案:

答案 0 :(得分:0)

更新

好的,如果oracle不能做断言,那么使用这个非断言的断言 注意 - 交替顺序至关重要。
另外,实际上,它匹配字符串中的每个字符。

.{1,10}$|.{0,9},|.{1,10}

格式化

    .{1,10} $           # EOS, take the remaining 10
 |  .{0,9} ,            # Mid string, 10 total, ending with ,
 |  .{1,10}             # Overflow, take any 10

如果oracle 可以做断言,那么这个正则表达式将特别针对您所声明的内容。
.{1,10}(?:(?=.)(?<=,)|$)|.{1,10}

格式化

    .{1,10}              # 1 to 10 chars
    (?:
         (?= . )              # If more than 10
         (?<= , )             # require a comma behind
      |                     # or,
         $                    # End of string
    )
 |                     # or,
    .{1,10}              # Overflow default, just get 10 chars

输出

 **  Grp 0 -  ( pos 0 , len 7 ) 
01,234,  
 **  Grp 0 -  ( pos 7 , len 10 ) 
456890,12,  
 **  Grp 0 -  ( pos 17 , len 5 ) 
3456,  
 **  Grp 0 -  ( pos 22 , len 10 ) 
7890123,12