简体   繁体   English

将一列中的多个分隔符拆分为表维护 ID

[英]Split string in one column multiple delimiters to table maintaining ID

I would like to split a string into a new table that I can use to join to the original table.我想将一个字符串拆分成一个新表,我可以用它来连接到原始表。 See code for an idea how data is stored in a column.有关如何将数据存储在列中的想法,请参阅代码。 I've我有

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')

I would very much like this to be split in three columns, ID, Lable, Value like so:我非常希望将其分为三列,ID、Lable、Value,如下所示:

id  lable      value

1   Lable1     Value1
1   Lable2     Value2
2   LableOneV  ValueOne
2   LableTwo   ValueTwo
2   LableThree ValueThree

Preferably I'd like to do this without cursors, without variables using ths XML trick.最好我想在没有游标的情况下做到这一点,没有使用 ths XML 技巧的变量。 I've come up with this (I cannot figure out how to add the ID per record).我想出了这个(我不知道如何为每条记录添加 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

Thank you.谢谢你。

just include the id field in your subquery只需在您的子查询中包含 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

You can use STRING_SPLIT function.您可以使用 STRING_SPLIT 函数。 this function available in SQL 2016 and it's above version.此函数在 SQL 2016 及以上版本中可用。 If you have smaller version then you can create table value split function and use that function in below query.如果您有较小的版本,那么您可以创建表值拆分函数并在下面的查询中使用该函数。 Hope this will help you.希望这会帮助你。

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM