字符串拆分为列而不是行

问题描述 投票:2回答:1

样本数据:

id  email_address                                   email_new
-------------------------------------------------------------------------------
1   [email protected]                      [email protected]
2   [email protected]; [email protected]      [email protected]
2   [email protected]; [email protected]      [email protected]
3   [email protected]; [email protected]; [email protected]  [email protected]
3   [email protected]; [email protected]; [email protected]  [email protected]
3   [email protected]; [email protected]; [email protected]  [email protected]

我使用以下查询将';'分隔的字符串拆分为行:

SELECT
    id, email_address, email_new
FROM 
    (SELECT 
         id, email_address, 
         Split.a.value('.', 'NVARCHAR(max)') AS email_new 
     FROM
         (SELECT 
              id, email_address, CAST ('<M>' + REPLACE(email_address, '; ', '</M><M>') + '</M>' AS XML) email_new
          FROM 
              table) AS A 
     CROSS APPLY 
         email_new.nodes ('/M') AS Split(a)) x
GROUP BY
    id, email_address, email_new

我的查询的问题是我不想为每个拆分电子邮件地址创建一个新行 - 我想为它添加一个新列。理想情况下,这有点类似:

id  email_1                      email_2                email_3
------------------------------------------------------------------------------
1   [email protected]   null                   null
2   [email protected]         [email protected]   null
3   [email protected]                  [email protected]            [email protected]

email_address列中有多达3个单独的电子邮件地址。有什么建议?如果它超过3,最好是答案可以占n列。

sql sql-server
1个回答
2
投票

测试数据

Declare @t table (Id INT, email_address VARCHAR(1000) , email_new VARCHAR(100));
INSERT INTO @t VALUES
(1   ,'[email protected]'                      , '[email protected]'),
(2   ,'[email protected]; [email protected]'      , '[email protected]'      ),
(2   ,'[email protected]; [email protected]'      , '[email protected]'      ),
(3   ,'[email protected]; [email protected]; [email protected]'  , '[email protected]'               ),
(3   ,'[email protected]; [email protected]; [email protected]'  , '[email protected]'               ),
(3   ,'[email protected]; [email protected]; [email protected]'  , '[email protected]'      );

询问

WITH Emails (ID , XmlEmail, email_new)
AS
(
    SELECT Id
          , CONVERT(XML,'<Emails><email>'  
                    + REPLACE(email_address,';', '</email><email>') 
                    + '</email></Emails>') AS XmlEmail
          , email_new
      FROM @t
)

 SELECT   ID
        , XmlEmail.value('/Emails[1]/email[1]','varchar(100)') AS Email1
        , XmlEmail.value('/Emails[1]/email[2]','varchar(100)') AS Email2
        , XmlEmail.value('/Emails[1]/email[3]','varchar(100)') AS Email3
        , XmlEmail.value('/Emails[1]/email[4]','varchar(100)') AS Email4
        , XmlEmail.value('/Emails[1]/email[5]','varchar(100)') AS Email5
        , email_new
FROM Emails

结果

╔════╦════════════════════════════╦═══════════════════════╦═══════════════════════╦═════════╦═════════╦════════════════════════════╗
║ ID ║           Email1           ║        Email2         ║        Email3         ║ Email4  ║ Email5  ║         email_new          ║
╠════╬════════════════════════════╬═══════════════════════╬═══════════════════════╬═════════╬═════════╬════════════════════════════╣
║  1 ║ [email protected] ║ NULL                  ║ NULL                  ║ NULL    ║ NULL    ║ [email protected] ║
║  2 ║ [email protected][email protected] ║ NULL                  ║ NULL    ║ NULL    ║ [email protected]       ║
║  2 ║ [email protected][email protected] ║ NULL                  ║ NULL    ║ NULL    ║ [email protected]       ║
║  3 ║ [email protected][email protected][email protected] ║ NULL    ║ NULL    ║ [email protected]                ║
║  3 ║ [email protected][email protected][email protected] ║ NULL    ║ NULL    ║ [email protected]                ║
║  3 ║ [email protected][email protected][email protected] ║ NULL    ║ NULL    ║ [email protected]       ║
╚════╩════════════════════════════╩═══════════════════════╩═══════════════════════╩═════════╩═════════╩════════════════════════════╝
© www.soinside.com 2019 - 2024. All rights reserved.