将一列中的字符串拆分为表维护 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 的多个分隔符的主要内容,如果未能解决你的问题,请参考以下文章

SQL 怎么将一列中的数据按一个分隔符分成多列显示

Pandas: 如何将一列中的文本拆分为多行? | Python

使用 SSIS OR T-SQL 将一列带引号和不带引号的逗号分隔值拆分为多列

如何将一列中的单词拆分然后在Python中将单词整合在一起,即二维列表到一维列表?

将一列拆分为多行

R中根据特定字符将一列拆分为几列的方法