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

Posted

技术标签:

【中文标题】Oracle SQL:为列中的每个值创建一个新行,其中更多值用逗号分隔【英文标题】:Oracle SQL: Create a new row for each value in a column with more values separated by comma 【发布时间】:2020-11-04 18:34:03 【问题描述】:

我有下表

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, GT, 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 中实现这一点。感谢您的帮助。

【问题讨论】:

【参考方案1】:

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"]。然后,我们可以使用 set-returning 函数json_table() 将数组取消嵌套到行。

【讨论】:

这行得通。它用逗号分割值并插入一行。但是计数部分很难添加对吗? @Virat:你想要计数的逻辑是什么?结果中的所有行都显示1,所以我猜不出来。 是的。我用 1 创建了一个列。所以,这个逻辑是完美的!

以上是关于Oracle SQL:为列中的每个值创建一个新行,其中更多值用逗号分隔的主要内容,如果未能解决你的问题,请参考以下文章

mysql - 为列中的每个值选择不重复的[重复]

SQL 将索引(订单值)设置为列

用于动态 sql 透视的 Oracle 函数

在 SQL Oracle 的 B 列中搜索 A 列的每个值

使用 MySQL 或 H2 将空值替换为列中的最新值

如何在R中的一列中添加具有不同值的新行