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

标签 sql oracle date oracle11g recursive-query

我们得到以下格式的数据,我可以使用正则表达式查询对其进行转换。数据是用管道连接的任务的开始和结束数据。

数据:

|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

我们需要将它与开始日期和结束日期分开。开始日期和结束日期组合的数量是动态的。但是开始日期会有结束日期,我们不会得到 null。

预期结果

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

提前致谢。

最佳答案

你可以做算术和条件聚合:

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 | END_DATE  
:--------- | :---------
2020/04/26 | 2020/05/02
2020/05/03 | 2020/05/10

关于sql - 在 Oracle SQL 中将 1 列转换为 2 列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61866322/

相关文章:

sql - 带有 ORDER 和 LIMIT 子句的极慢 PostgreSQL 查询

java - 为什么从/manager 重新启动应用程序会导致大量 "this web application instance has been stopped already. "警告。为什么?

java - 通过日期字符串获取其他TimeZone的时间,结果错误

SQL Oracle - 如果所有行均为 'None',则返回消息,否则返回行。不返回 'None'

sql - 如何填补空白?

python - 如何从 Pandas 中的前 20 个唯一日期(其实例计数不相等)中选择所有柱状值

sql - 分组依据为空时的子查询选择

sql - 如果不同表中的列匹配则更新值

mysql - 仅在数据库查询时名字和姓氏的首字母

sql - 使用 CONNECT BY PRIOR 进行分层查询 - Oracle SQL