当前位置: 首页 > 面试题库 >

字符串拆分为列而不是行

简成仁
2023-03-14
问题内容

样本数据:

id  email_address                                   email_new
-------------------------------------------------------------------------------
1   a.b@wellsfargoadvisors.com                      a.b@wellsfargoadvisors.com
2   c.b@RaymondJames.com; abc@RaymondJames.com      c.b@RaymondJames.com
2   c.b@RaymondJames.com; abc@RaymondJames.com      abc@RaymondJames.com
3   a.b@boa.com; bbc@boa.com; hh@bankofamerica.com  a.b@boa.com
3   a.b@boa.com; bbc@boa.com; hh@bankofamerica.com  bbc@boa.com
3   a.b@boa.com; bbc@boa.com; hh@bankofamerica.com  hh@bankofamerica.com

我使用以下查询将’ ;‘’分隔的字符串分成几行:

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   a.b@wellsfargoadvisors.com   null                   null
2   c.b@RaymondJames.com         abc@RaymondJames.com   null
3   a.b@boa.com                  bbc@boa.com            h@bankofamerica.com

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


问题答案:

测试数据

Declare @t table (Id INT, email_address VARCHAR(1000) , email_new VARCHAR(100));
INSERT INTO @t VALUES
(1   ,'a.b@wellsfargoadvisors.com'                      , 'a.b@wellsfargoadvisors.com'),
(2   ,'c.b@RaymondJames.com; abc@RaymondJames.com'      , 'c.b@RaymondJames.com'      ),
(2   ,'c.b@RaymondJames.com; abc@RaymondJames.com'      , 'abc@RaymondJames.com'      ),
(3   ,'a.b@boa.com; bbc@boa.com; hh@bankofamerica.com'  , 'a.b@boa.com'               ),
(3   ,'a.b@boa.com; bbc@boa.com; hh@bankofamerica.com'  , 'bbc@boa.com'               ),
(3   ,'a.b@boa.com; bbc@boa.com; hh@bankofamerica.com'  , 'hh@bankofamerica.com'      );

询问

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          鈺�


 类似资料:
  • 问题内容: 我正在努力将字符串转换为元组而不在此过程中拆分字符串的字符。有人可以建议一种简单的方法来做到这一点。需要一个衬板。 失败 作品 由于我的输入是字符串,因此我尝试了以下代码,将字符串转换为列表,该列表再次将字符串拆分为字符.. 失败 预期产量: 产生的输出: 问题答案: 你可以做。无需使用功能。(请注意,逗号是必需的。) 从本质上讲,是指做出的一个元组 内容 的,不只是由一个元组本身。字

  • 问题内容: 如何拆分字符串并获取NULL值而不是空字符串。 我特别感兴趣的两个方法和。我希望这个查询: 将返回第三行而不是空字符串。有没有简单的方法可以做到这一点,即使用特殊字符?我的意思是: 我希望我可以使用方法从字符串中提取NULL : 从这里获取的代码:https : //sqlperformance.com/2016/03/t-sql-queries/string- split 问题答案:

  • 问题内容: 我想分裂字符串列,其中值 不等于 到 并保存到另一个表,这将是这样的: 这是我的分割字符串代码: 这是我用来调用该函数的代码: 上面的代码给我这个错误: 问题答案: 子查询返回了1个以上的值。当子查询遵循=,!=,<,<=,>,> =或将子查询用作表达式时,不允许这样做。该语句已终止。 由于您的子查询返回了多行,因此发生了上述错误。尝试执行以下操作: 您会看到它将返回3行,每一项返回一

  • 理想情况下,我希望这些新列也被命名。

  • 问题内容: 我正在寻找一些类似的东西 其中是句子的集合,并且是每行的字符长度。它可能会很长,我想将其基本上以数组的形式分成多行。 例如 问题答案: 这段代码避免打断单词,您不会使用wordwrap()来获得它。 最大长度使用定义。我已经做过一些测试,并且工作正常。

  • 问题内容: 我需要在SQL Server 2012中将一列中的字符串拆分为一个字符,并将每个字符串拆分成它自己的列。 例如:如果我有一个栏,我需要把它拆分成,,,,,与每个这些转化为自己列。 要拆分的列的长度可能会有所不同,因此我需要使其尽可能地动态。 问题答案: 您可以这样做: 输出: 这是动态版本: