在Oracle SQL中将1列转换为2列

我们以以下格式获取数据,可以使用正则表达式查询将其转换。数据是与管道连接的任务的开始和结束数据。

数据:

|2020/04/26|2020/05/02|2020/05/03|2020/05/10 

查询:

select   REGEXP_SUBSTR (:p, '[^|]+', 1, level) as periods from dual
connect by  level <= length (regexp_replace(:p, '[^|]+'))

结果:

2020/04/26
2020/05/02
2020/05/03
2020/05/10

我们需要将其与开始日期和结束日期分开。开始日期和结束日期组合的数量是动态的。但是开始日期会有结束日期,因此不会为空。

预期结果

START DATE      END DATE 
2020/04/26      2020/05/02
2020/05/03      2020/05/10

提前致谢。

评论
  • bdicta
    bdicta 回复

    您可以进行算术和条件聚合:

    select 
        max(case when mod(lvl, 2) = 0 then periods end) start_date,
        max(case when mod(lvl, 2) = 1 then periods end) end_date
    from (
        select 
            regexp_substr (:p, '[^|]+', 1, level) as periods,
            level - 1 as lvl
        from dual
        connect by  level <= length (regexp_replace(:p, '[^|]+'))
    ) t
    group by trunc(lvl / 2)
    

    Demo on DB Fiddle:

    START_DATE |结束日期
    :--------- | :---------
    2020/04/26 | 2020/05/02
    2020/05/03 | 2020/05/10