将一列中的字符串拆分为表维护 ID 的多个分隔符
Posted
技术标签:
【中文标题】将一列中的字符串拆分为表维护 ID 的多个分隔符【英文标题】:Split string in one column multiple delimiters to table maintaining ID 【发布时间】:2018-08-24 06:25:40 【问题描述】:我想将一个字符串拆分成一个新表,我可以用它来加入原始表。请参阅代码以了解如何将数据存储在列中。 我已经
CREATE TABLE #tmpsplit
(
id INT IDENTITY(1,1)
, StringToSplit varchar(100)
)
INSERT INTO #tmpsplit VALUES ('Lable1:Value1|Lable2:Value2')
INSERT INTO #tmpsplit VALUES ('Lable1:ValueOne|Lable2:ValueTwo|Lable3:ValueThree')
我非常希望将其拆分为三列,ID、Lable、Value,如下所示:
id lable value
1 Lable1 Value1
1 Lable2 Value2
2 LableOneV ValueOne
2 LableTwo ValueTwo
2 LableThree ValueThree
我最好不使用游标,不使用 XML 技巧的变量来执行此操作。我想出了这个(我不知道如何为每条记录添加 ID)。
SELECT
SUBSTRING(t2.value,1,CHARINDEX(':',t2.value)-1) AS Lable
, SUBSTRING(t2.value,CHARINDEX(':',t2.value)+1,LEN(t2.value)) AS Value
FROM
(SELECT Cast ('<x>' + Replace(StringToSplit, '|', '</x><x>') + '</x>' AS XML) AS RawData FROM #tmpsplit) t1
CROSS APPLY
(SELECT y.value('.','varchar(100)') as value FROM RawData.nodes('x') as f(y)) t2
谢谢。
【问题讨论】:
你可以根据这个帖子split comma separated string into columns来做这个。 【参考方案1】:只需在子查询中包含 id 字段
SELECT
id
,SUBSTRING(t2.value,1,CHARINDEX(':',t2.value)-1) AS Lable
,SUBSTRING(t2.value,CHARINDEX(':',t2.value)+1,LEN(t2.value)) AS Value
FROM
(SELECT id, Cast ('<x>' + Replace(StringToSplit, '|', '</x><x>') + '</x>' AS XML) AS
RawData FROM #tmpsplit) t1
CROSS APPLY
(SELECT y.value('.','varchar(100)') as value FROM RawData.nodes('x') as f(y)) t2
【讨论】:
谢谢。我不知道为什么我一开始没有得到这个。我觉得很害羞。【参考方案2】:您可以使用 STRING_SPLIT 函数。此功能在 SQL 2016 及以上版本中可用。如果您有较小的版本,那么您可以创建表值拆分函数并在下面的查询中使用该函数。希望这会对你有所帮助。
SELECT
t.id
,SUBSTRING(t2.value,1,CHARINDEX(':',t2.value)-1) AS Lable
, SUBSTRING(t2.value,CHARINDEX(':',t2.value)+1,LEN(t2.value)) AS Value
FROM #tmpsplit T
CROSS APPLY (SELECT value FROM STRING_SPLIT(T.StringToSplit, '|'))T2
【讨论】:
以上是关于将一列中的字符串拆分为表维护 ID 的多个分隔符的主要内容,如果未能解决你的问题,请参考以下文章
Pandas: 如何将一列中的文本拆分为多行? | Python
使用 SSIS OR T-SQL 将一列带引号和不带引号的逗号分隔值拆分为多列