如何将拆分数据与 SQL 合并

How to merge split data with SQL

原回答:
我需要按指定的分隔符拆分字符串。我在 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

等等?


根据山羊的回答更新:

/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;

您可以使用 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