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