样本数据:
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列。
测试数据
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] ║
╚════╩════════════════════════════╩═══════════════════════╩═══════════════════════╩═════════╩═════════╩════════════════════════════╝