【问题标题】:How to merge split data with SQL如何使用 SQL 合并拆分数据
【发布时间】:2015-03-24 07:12:01
【问题描述】:

原答案:
我需要按指定的分隔符拆分字符串。我已经通过SQL Performance - T-SQL Queries - Split Strings 上的指南使用Numbers Table 实现了这一点。但是,一旦字符串被拆分,如何将其合并回列中?所以这种形式的分割字符串的结果:

**Item**
a
id
xyz
abcd
a
id
xyz
abcd

转换成这种形式:

C1 C2  C3   C4
a  id  xyz  abc
a  id  xyz  abc

等等?


根据 Goat 的回答更新

/abc/def/ghi/jkl.html_abc_def

应该拆分成

C1   C2   C3   C4   C5
abc  def  ghi  jkl  html_abc_def

这是我目前所拥有的

WITH CTE AS (SELECT testString = 'abc/def/ghi/jkl.html_abc_def'
            ),
     splitString
     AS (SELECT *,
         CONVERT(XML, '<String><Section>'
                      + Replace(Replace((substring(teststring,1,patindex('%.html%',teststring)-1)),'_','/'), '/', '</Section><Section>')
                      + '</Section></String>') AS xmlString
         FROM   CTE)
SELECT xmlstring.value('/String[1]/Section[1]', 'varchar(100)') AS Col1,
       xmlstring.value('/String[1]/Section[2]', 'varchar(100)') AS Col2,
       xmlstring.value('/String[1]/Section[3]', 'varchar(100)') AS Col3,
       xmlstring.value('/String[1]/Section[4]', 'varchar(100)') AS Col4,
       xmlstring.value('/String[1]/Section[5]', 'varchar(100)') AS Col5,
       xmlstring.value('/String[1]/Section[6]', 'varchar(100)') AS Col6
FROM   splitstring;

--select substring(teststring,1,patindex('%.html%',teststring)-1) first
--substring(teststring,patindex('%.html%',teststring)+1,200) second

第一个子字符串获取.html 的数据,第二个获取它后面的数据。但我不知道如何将它们放在一起。

知道了:

WITH CTE AS (SELECT testString = 'abc/def/ghi/jkl.html_abc_def'
            ),
     splitString
     AS (SELECT *,
         CONVERT(XML, '<String><Section>'
                      + Replace(Replace((substring(teststring,1,patindex('%.html%',teststring)-1)),'_','/'), '/', '</Section><Section>')
                      + '</Section></String>'
                      + '<String><Section>'
                      + substring(teststring,patindex('%.html%',teststring)+1,200)
                      + '</Section></String>'
                      ) AS xmlString
         FROM   CTE)
SELECT xmlstring.value('/String[1]/Section[1]', 'varchar(100)') AS Col1,
       xmlstring.value('/String[1]/Section[2]', 'varchar(100)') AS Col2,
       xmlstring.value('/String[1]/Section[3]', 'varchar(100)') AS Col3,
       xmlstring.value('/String[1]/Section[4]', 'varchar(100)') AS Col4,
       xmlstring.value('/String[2]/Section[1]', 'varchar(100)') AS Col5
FROM   splitstring;

【问题讨论】:

  • 您想将字符串拆分为列,而不是行,对吧?
  • 是的。我首先做的是链接上的指南。但是,它将所有拆分数据返回到一列,而不是多列。

标签: sql sql-server tsql merge sql-server-2012


【解决方案1】:

您可以使用XML 功能将分隔字符串拆分为单独的列,而不是先拆分为行:

;WITH cte AS (SELECT testString = 'test,1,2,3'
              UNION  SELECT 'test,2,3,4'
              UNION  SELECT 'test,5,6,7')
     ,SplitString AS (SELECT *,
                             CONVERT(XML,'<String><Section>'+ REPLACE(testString,',', '</Section><Section>') + '</Section></String>') AS xmlString
                      FROM cte
                      )    
 SELECT xmlString.value('/String[1]/Section[1]','varchar(100)') AS Col1
       ,xmlString.value('/String[1]/Section[2]','varchar(100)') AS Col2
       ,xmlString.value('/String[1]/Section[3]','varchar(100)') AS Col3
       ,xmlString.value('/String[1]/Section[4]','varchar(100)') AS Col4
 FROM SplitString 

注意:以上使用逗号作为分隔符,请相应更改REPLACE()

更新:很高兴你把它整理好了,不过看起来你可能过于复杂了 XML 创建,我认为你可以将 . 替换为 / 然后使用 /在第二个REPLACE()

;WITH cte AS (SELECT testString = 'abc/def/ghi/jkl.html_abc_def')
     ,SplitString AS (SELECT *,
                             CONVERT(XML,'<String><Section>'+ REPLACE(REPLACE(testString,'.','/'),'/', '</Section><Section>') + '</Section></String>') AS xmlString
                      FROM cte
                      )    
 SELECT xmlString.value('/String[1]/Section[1]','varchar(100)') AS Col1
       ,xmlString.value('/String[1]/Section[2]','varchar(100)') AS Col2
       ,xmlString.value('/String[1]/Section[3]','varchar(100)') AS Col3
       ,xmlString.value('/String[1]/Section[4]','varchar(100)') AS Col4
       ,xmlString.value('/String[1]/Section[5]','varchar(100)') AS Col5
 FROM SplitString 

【讨论】:

  • 如果有两种分隔符怎么办?例如。一个是“/”,第二个是“-”。这也可以内置到这个解决方案中吗?
  • @DNac 当然,您可以分两步进行拆分,首先在一个分隔符上,然后在另一个分隔符上,或者您可以添加另一个 REPLACE() 以使所有分隔符相同:CONVERT(XML,'&lt;String&gt;&lt;Section&gt;'+ REPLACE(REPLACE(testString,'/','-'),'-', '&lt;/Section&gt;&lt;Section&gt;') + '&lt;/Section&gt;&lt;/String&gt;') AS xmlString
  • 好的,这很棒。谢谢你。最后一个问题:您能帮我实现这一目标吗?我有例如字符串 /abc/def/ghi/jkl.html_abc_def。如何将 .html 之后的部分放入一列而不再拆分它们?我会更新答案以便更好地理解。
  • 知道了!感谢帮助!我对这个解决方案感到非常高兴:)
  • @DNac 很好,刚刚注意到您的后续问题,也许可以简化您的XML 创建,请参阅更新。
猜你喜欢
  • 2015-01-27
  • 2015-10-21
  • 2022-11-26
  • 2014-09-05
  • 2022-01-14
  • 1970-01-01
  • 1970-01-01
  • 2022-12-15
  • 1970-01-01
相关资源
最近更新 更多