【问题标题】:Splitting string into multiple rows in Oracle separated by pipe在Oracle中将字符串拆分为多行,用管道分隔
【发布时间】:2020-01-30 21:19:15
【问题描述】:

我在 Oracle 中有 3 列的数据,如下所示:

username    user.prof    values
__________________________________________
user_name1       user.prof1       1|2|3
user_name2       user.prof2       NOT_REQUIRED
user_name3       user.prof3       779|678|1|2|3

如您所见,这些值由竖线字符分隔,并且它们的编号不固定。 期望的结果:

username    user.prof    values
__________________________________________
user_name1    user.prof1    1
user_name1    user.prof1    2
user_name1    user.prof1    3
user_name2    user.prof2    NOT_REQUIRED
user_name3    user.prof3    779
user_name3    user.prof3    678
user_name3    user.prof3    1
user_name3    user.prof3    2
user_name3    user.prof3    3

有人可以帮我解决这个问题吗?谢谢!!

【问题讨论】:

    标签: sql oracle split pipe delimiter


    【解决方案1】:

    这是一种选择:

    SQL> with test (username, user_prof, value) as
      2    (select 'user_name1', 'user.prof1', '1|2|3'         from dual union all
      3     select 'user_name2', 'user.prof2', 'NOT_REQUIRED'  from dual union all
      4     select 'user_name3', 'user.prof3', '779|678|1|2|3' from dual
      5    )
      6  select
      7    username,
      8    user_prof,
      9    regexp_substr(value, '[^\|]+', 1, column_value) value
     10  from test cross join
     11       table(cast(multiset(select level from dual
     12                           connect by level <= regexp_count(value, '\|') + 1
     13                          ) as sys.odcinumberlist));
    
    USERNAME   USER_PROF  VALUE
    ---------- ---------- ----------------------------------------------------
    user_name1 user.prof1 1
    user_name1 user.prof1 2
    user_name1 user.prof1 3
    user_name2 user.prof2 NOT_REQUIRED
    user_name3 user.prof3 779
    user_name3 user.prof3 678
    user_name3 user.prof3 1
    user_name3 user.prof3 2
    user_name3 user.prof3 3
    
    9 rows selected.
    
    SQL>
    

    【讨论】:

      【解决方案2】:

      您必须使用递归 cte 来执行此操作:

      WITH split_values ( username, values1, start1, end1 ) AS (
        SELECT username, values1, 1, instr( values1, '|', 1 )
        FROM  table_name
        UNION ALL
        SELECT username, values1, end1 + 1, INSTR( values1, '|', end1 + 1 )
        FROM   split_values
        WHERE  end1 > 0
      )
      SELECT username, 
            CASE end1
                WHEN 0 THEN SUBSTR( values1, start1 )
             ELSE SUBSTR( values1, start1, end1 - start1 )
             END AS values1
      FROM   split_values
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-17
        相关资源
        最近更新 更多