【问题标题】:Split a data into a length and also by delimiter in Oracle将数据拆分为长度,也可以通过 Oracle 中的分隔符
【发布时间】:2016-04-17 10:13:51
【问题描述】:

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

规则 1:拆分长度为 10 个字符的字符串。

规则 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 

【问题讨论】:

  • 你尝试过什么吗?
  • 是的,我试过这个查询,但它被 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非空

标签: sql regex oracle11g


【解决方案1】:

更新

好的,如果 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  

【讨论】:

  • 什么意思:“如果 Oracle 可以做断言”?
  • 我的意思是 如果 Oracle 可以做断言
  • 你的意思是如果Oracle可以做正则表达式断言
  • so...Oracle 可以做正则表达式断言吗?
  • 我尝试使用断言表达式 SELECT DISTINCT regexp_replace('01,234,456890,12,3456,7890123,12','(.{1,10}(?:(?=.)(?
猜你喜欢
  • 1970-01-01
  • 2022-07-29
  • 2016-08-02
  • 2020-03-11
  • 1970-01-01
  • 1970-01-01
  • 2018-03-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多