Oracle SQL:为列中的每个值创建一个新行,其中更多值用逗号分隔

问题描述

我有下表

SELECT * FROM TABLE1

 Date            ID          Completed_Task
01/01/2019       X300         SA,MA,TY
01/01/2019       X400         SA,GT,JY
01/01/2019       X500         SA,TY

我需要该表每行具有一个Completed_Task,并且该completed_task的计数(如果发生一次,则为1)

所需的输出

 Date            ID          Completed_Task     Count
01/01/2019       X300             SA             1
01/01/2019       X300             MA             1
01/01/2019       X300             TY             1
01/01/2019       X400             SA             1   
01/01/2019       X400             GT             1  
01/01/2019       X400             JY             1        
01/01/2019       X500             SA             1
01/01/2019       X500             GT             1
01/01/2019       X500             TY             1

让我知道如何在Oracle sql中实现此目标。感谢您的帮助。

解决方法

JSON方法如何?

select t.dt,t.id,x.task
from table1 t
cross apply json_table(
    '["' || replace(completed_task,','","') || '"]','$[*]' columns (task varchar2(10) path '$')
) x

这个想法是将CSV列表视为JSON数组。为此,我们使用字符串函数将'SA,MA,TY'转换为["SA","MA","TY"]。然后,我们可以使用集合返回函数json_table()将数组取消嵌套为行。