【问题标题】:Duplicate rows where a column contains ","列包含“,”的重复行
【发布时间】:2020-09-11 23:02:17
【问题描述】:

我有如下数据

name    subject
a       m1
b       m2
c       m1, m3
d       m4, m5, m6
e       m7

我想复制整行,其中列 subject 包含 , 。原始数据的列比此处显示的多得多。我将在subject 列中复制等于, 数量的行,因此我将重复c 1 次和d 2 次​​p>

我不知道subject 列中有多少个单元格会有,,并且subject 列的单元格中的值数量没有上限

然后我想在重复的行上只保留一个值,这样主题列中的所有值都会出现一次

name    subject
a       m1
b       m2
c       m1
c       m3
d       m4
d       m5
d       m6
e       m7

【问题讨论】:

    标签: sql sql-server string csv unnest


    【解决方案1】:

    如果您运行的是 SQL Server 2016 或更高版本,则可以使用string_split()

    select t.name, value as subject
    from mytable t
    cross apply string_split(subject, ', ')
    

    string_split() 返回一个唯一列,称为value

    【讨论】:

    • 您能解释一下cross apply 的工作原理吗?它如何确保我们正确地重复其余的列?
    • @user2543622:那是a lateral join。如果您想要原始表中的更多列,只需在 select 子句中列出它们即可。
    • 我可以说select t.*, values as subject1然后删除subject吗?
    • @user2543622:在 SQL Server 中,您不能从结果集中“删除”一列。你可以做select t.*, value as subject1,你会在结果集中得到sujectsubject1。否则,您需要在select 子句中列出所有列名(除了subject)。
    猜你喜欢
    • 2014-01-22
    • 1970-01-01
    • 2019-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-02
    • 2020-05-22
    • 1970-01-01
    相关资源
    最近更新 更多