【问题标题】:Split Delimiter拆分分隔符
【发布时间】:2019-07-02 17:03:13
【问题描述】:

我有两个表表 A 和表 B。我需要从表 B 中添加表 A 中的电子邮件 ID 列。

例如,

表 A

表 B

预期结果:

【问题讨论】:

  • 请标记相关的数据库平台。你试过什么?
  • 将分隔数据存储到单个列中是一种巨大的反模式,会导致一些真正的痛苦。如果您的 RDBMS 支持拆分或数组,您可能有机会完成此操作。您使用的是什么 RDBMS?
  • 2016+ ?然后你有STRING_SPLIT
  • 是的...我使用的是 2016

标签: sql sql-server delimiter


【解决方案1】:

尝试以下方法:

declare @table_A table (username varchar(1000))
declare @table_B table (username varchar(1000), email_id varchar(2000))

insert into @table_A
select 'User, AA # User, BB'
union
select 'User, CC # User, DD # User, EE'
union
select 'User, FF # User, GG # User, HH'

insert into @table_B
select 'User, AA','User.a@gmail.com'
union
select 'User, BB','User.b@gmail.com'
union
select 'User, CC','User.c@gmail.com'
union
select 'User, DD','User.d@gmail.com'
union
select 'User, EE','User.e@gmail.com'
union
select 'User, FF','User.f@gmail.com'
union
select 'User, GG','User.g@gmail.com'
union
select 'User, HH','User.h@gmail.com'

select A.username, B.email_id into #temp
from
(
    select username, ltrim(rtrim(value)) val
    from @table_A
    cross apply string_split(username, '#') 
)A
left join @table_B B on B.username = A.val  

select username, ltrim(rtrim(stuff((
        select DISTINCT ' # ' + u.email_id
        from #temp u
        where u.username = t.username
        for xml path('')
    ),2,1,''))) as email_id
from #temp t
group by username

drop table if exists #temp

【讨论】:

    【解决方案2】:

    使用STUFF 函数的另一种方式可能很有趣

    declare @TableA table (username varchar(1000))
    declare @TableB table (username varchar(1000), email_id varchar(2000))
    
    insert into @TableA values
    ('User, AA # User, BB'),('User, CC # User, DD # User, EE'),('User, FF # User, GG # User, HH')
    
    insert into @TableB values
    ('User, AA','User.a@gmail.com'),('User, BB','User.b@gmail.com'),('User, CC','User.c@gmail.com'),
    ('User, DD','User.d@gmail.com'),('User, EE','User.e@gmail.com'),('User, FF','User.f@gmail.com'),
    ('User, GG','User.g@gmail.com'),('User, HH','User.h@gmail.com')
    
    ;with ct as (
    select a.username, b.email_id
    from @TableB b
        inner join @TableA a on charindex(b.username, a.username) > 0
    )
    select username, abc = STUFF 
    (
        (
            SELECT ' # ' + email_id
            FROM ct As t2
            WHERE t2.username = t1.username
            ORDER BY username
            FOR XML PATH (''), TYPE
        ).value('.', 'varchar(max)')
    , 1, 1, '')
    from ct t1
    group by username
    

    结果

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多