oracle 从具有管道字符串的另一个表列创建表

iq3niunx  于 2023-01-16  发布在  Oracle
关注(0)|答案(1)|浏览(131)

我有一个表。它包含2列(id,value)。Value列保存日期和状态。(a:活动,s:挂起,d:停用)

id | value
1  | 220325a|220608s
2  | 220325a|220325d|220822a|220822d
3  | 220325a
4  | 220325a|220329d

我想做的是像这样解析值列

My new table :

 id | start_date | end_date
 1  | 25.03.2022 | 08.06.2022
 2  | 25.03.2022 | 25.03.2022
 2  | 22.08.2022 | 22.08.2022 
 3  | 25.03.2022
 4  | 25.03.2022 | 29.03.2022

我想我必须使用嵌套循环,但我如何找到一个接一个的日期?

2lpgd968

2lpgd9681#

可以使用递归查询和简单的字符串函数:

WITH bounds (id, value, spos, mpos, epos) AS (
  SELECT id,
         value,
         1,
         INSTR(value, '|', 1, 1),
         INSTR(value, '|', 1, 2)
  FROM   table_name
UNION ALL
  SELECT id,
         value,
         epos + 1,
         INSTR(value, '|', epos + 1, 1),
         INSTR(value, '|', epos + 1, 2)
  FROM   bounds
  WHERE  epos > 0
)
SEARCH DEPTH FIRST BY id SET order_id
SELECT id,
       TO_DATE(SUBSTR(value, spos, 6), 'RRMMDD') AS start_date,
       CASE 
       WHEN mpos = 0
       THEN NULL
       ELSE TO_DATE(SUBSTR(value, mpos + 1, 6), 'RRMMDD')
       END AS end_date,
       SUBSTR(value, spos + 6, 1) AS start_status,
       CASE 
       WHEN mpos = 0
       THEN NULL
       ELSE SUBSTR(value, mpos + 7, 1)
       END AS end_status
FROM   bounds;

其中,对于示例数据:

CREATE TABLE table_name (id, value) AS
SELECT 1, '220325a|220608s' FROM DUAL UNION ALL
SELECT 2, '220325a|220325d|220822a|220822d' FROM DUAL UNION ALL
SELECT 3, '220325a' FROM DUAL UNION ALL
SELECT 4, '220325a|220329d' FROM DUAL;

输出:
| 识别号|开始日期|结束日期|开始状态|结束状态|
| - ------|- ------|- ------|- ------|- ------|
| 1个|2022年3月25日00时00分|2022年6月8日00时00分|项目a|S的|
| 第二章|2022年3月25日00时00分|2022年3月25日00时00分|项目a|日|
| 第二章|2022年8月22日00时00分|2022年8月22日00时00分|项目a|日|
| 三个|2022年3月25日00时00分|* 无效 |项目a| 无效 *|
| 四个|2022年3月25日00时00分|2022年3月29日00时00分|项目a|日|
fiddle

相关问题