如何在sql server中动态多次拆分字符串并将其分为多个组
我有一张如下表:如何在sql server中动态多次拆分字符串并将其分为多个组,sql,sql-server-2008,tsql,Sql,Sql Server 2008,Tsql,我有一张如下表: ref_id 21121212122233333333 21222233333333333333 22112212333333333333 22213333333333333333 结果应该是这样的 ref_id `Group_1 ` `Group_2`Group_3`Group_4`Group_5` 21121212122233333333 2 112 12 12 1222 2122223333333
ref_id
21121212122233333333
21222233333333333333
22112212333333333333
22213333333333333333
结果应该是这样的
ref_id `Group_1 ` `Group_2`Group_3`Group_4`Group_5`
21121212122233333333 2 112 12 12 1222
21222233333333333333 2 12222
22112212333333333333 22 1122 12
12213333333333333333 122 1
查询将获取数字1之前的字符串部分(例如2或22),并将字符串部分从1提取到1之前的下一部分(例如12222),但不包括3。我注意到可能有n个组
不知道怎么做。。。任何帮助都将不胜感激 DECLARE@ref表(RowID INT IDENTITY,ref_id NVARCHAR(20))
DECLARE @ref TABLE (RowID INT IDENTITY, ref_id NVARCHAR (20))
DECLARE @refunpivot TABLE (RowID INT, ColumnID INT, RefString NVARCHAR(20))
DECLARE @refpivot TABLE (RowID INT IDENTITY
,ref_id NVARCHAR (20)
,Group_01 NVARCHAR (20)
,Group_02 NVARCHAR (20)
,Group_03 NVARCHAR (20)
,Group_04 NVARCHAR (20)
,Group_05 NVARCHAR (20)
,Group_06 NVARCHAR (20)
,Group_07 NVARCHAR (20)
,Group_08 NVARCHAR (20)
,Group_09 NVARCHAR (20)
,Group_10 NVARCHAR (20)
)
INSERT INTO @ref VALUES
('21121212122233333333'),
('21222233333333333333'),
('22112212333333333333'),
('22213333333333333333')
DECLARE @refstring NVARCHAR (20)
DECLARE @Counter1 INT = 0
DECLARE @Counter2 INT = 0
DECLARE @Marker INT
WHILE @Counter1 < (SELECT MAX(RowID) FROM @ref) BEGIN
SET @Counter1 += 1
SET @refstring = (SELECT ref_id FROM @ref WHERE RowID = @Counter1)
SET @refstring = LEFT(@refstring,CHARINDEX('3',@refstring)-1)
SET @Counter2 = 0
WHILE CHARINDEX('1',@refstring) > 0 BEGIN
SET @Counter2 += 1
SET @Marker = CHARINDEX('1',RIGHT(@refstring,LEN(@refstring)-1))
INSERT INTO @refunpivot SELECT @Counter1, @Counter2, LEFT(@refstring,@Marker)
SET @refstring = RIGHT(@refstring,LEN(@refstring)-@Marker)
IF CHARINDEX('1',RIGHT(@refstring,LEN(@refstring)-1)) = 0
BEGIN
SET @Counter2 += 1
INSERT INTO @refunpivot SELECT @Counter1, @Counter2, @refstring
SET @refstring = ''
END
END
END
SET @Counter1 = 0
WHILE @Counter1 < (SELECT MAX(RowID) FROM @refunpivot) BEGIN
SET @Counter1 += 1
INSERT INTO @refpivot (ref_id)
SELECT ref_id FROM @ref WHERE RowID = @Counter1
UPDATE @refpivot
SET Group_01 = COALESCE((SELECT RefString FROM @refunpivot WHERE RowID = @Counter1 AND ColumnID = 1),'')
WHERE RowID = @Counter1
UPDATE @refpivot
SET Group_02 = COALESCE((SELECT RefString FROM @refunpivot WHERE RowID = @Counter1 AND ColumnID = 2),'')
WHERE RowID = @Counter1
UPDATE @refpivot
SET Group_03 = COALESCE((SELECT RefString FROM @refunpivot WHERE RowID = @Counter1 AND ColumnID = 3),'')
WHERE RowID = @Counter1
UPDATE @refpivot
SET Group_04 = COALESCE((SELECT RefString FROM @refunpivot WHERE RowID = @Counter1 AND ColumnID = 4),'')
WHERE RowID = @Counter1
UPDATE @refpivot
SET Group_05 = COALESCE((SELECT RefString FROM @refunpivot WHERE RowID = @Counter1 AND ColumnID = 5),'')
WHERE RowID = @Counter1
UPDATE @refpivot
SET Group_06 = COALESCE((SELECT RefString FROM @refunpivot WHERE RowID = @Counter1 AND ColumnID = 6),'')
WHERE RowID = @Counter1
UPDATE @refpivot
SET Group_07 = COALESCE((SELECT RefString FROM @refunpivot WHERE RowID = @Counter1 AND ColumnID = 7),'')
WHERE RowID = @Counter1
UPDATE @refpivot
SET Group_08 = COALESCE((SELECT RefString FROM @refunpivot WHERE RowID = @Counter1 AND ColumnID = 8),'')
WHERE RowID = @Counter1
UPDATE @refpivot
SET Group_09 = COALESCE((SELECT RefString FROM @refunpivot WHERE RowID = @Counter1 AND ColumnID = 9),'')
WHERE RowID = @Counter1
UPDATE @refpivot
SET Group_10 = COALESCE((SELECT RefString FROM @refunpivot WHERE RowID = @Counter1 AND ColumnID = 10),'')
WHERE RowID = @Counter1
END
SELECT * FROM @refpivot
声明@refunpivot表(RowID INT、ColumnID INT、RefString NVARCHAR(20))
声明@refpivot表(RowID INT-IDENTITY)
,参考编号NVARCHAR(20)
,第01组NVARCHAR(20)
,第02组NVARCHAR(20)
,第03组NVARCHAR(20)
,第04组NVARCHAR(20)
,第05组NVARCHAR(20)
,第06组NVARCHAR(20)
,第07组NVARCHAR(20)
,第08组NVARCHAR(20)
,第09组NVARCHAR(20)
,第10组NVARCHAR(20)
)
插入@ref值
('21121212122233333333'),
('21222233333333333333'),
('22112212333333333333'),
('22213333333333333333')
声明@refstring NVARCHAR(20)
声明@Counter1 INT=0
声明@Counter2 INT=0
声明@Marker INT
当@Counter1<(从@ref中选择MAX(RowID)时,开始
设置@Counter1+=1
设置@refstring=(从@ref中选择ref\u id,其中RowID=@Counter1)
设置@refstring=LEFT(@refstring,CHARINDEX('3',@refstring)-1)
设置@Counter2=0
当CHARINDEX('1',@refstring)>0开始时
设置@Counter2+=1
设置@Marker=CHARINDEX('1',右(@refstring,LEN(@refstring)-1))
插入到@refunpivot中,选择@Counter1、@Counter2、左(@refstring、@Marker)
设置@refstring=RIGHT(@refstring,LEN(@refstring)-@Marker)
如果CHARINDEX('1',RIGHT(@refstring,LEN(@refstring)-1))=0
开始
设置@Counter2+=1
插入@refunpivot选择@Counter1、@Counter2、@refstring
设置@refstring=''
结束
结束
结束
设置@Counter1=0
当@Counter1<(从@refunpivot选择MAX(RowID))开始时
设置@Counter1+=1
插入@refpivot(ref\u id)
从@ref中选择ref_id,其中RowID=@Counter1
更新@refpivot
设置组_01=COALESCE((从@refunpivot中选择RefString,其中RowID=@Counter1,ColumnID=1),“”)
其中RowID=@Counter1
更新@refpivot
设置组_02=COALESCE((从@refunpivot中选择RefString,其中RowID=@Counter1,ColumnID=2),“”)
其中RowID=@Counter1
更新@refpivot
设置组_03=COALESCE((从@refunpivot中选择RefString,其中RowID=@Counter1,ColumnID=3),“”)
其中RowID=@Counter1
更新@refpivot
设置组_04=COALESCE((从@refunpivot中选择RefString,其中RowID=@Counter1,ColumnID=4),“”)
其中RowID=@Counter1
更新@refpivot
设置组_05=合并((从@refunpivot中选择RefString,其中RowID=@Counter1,ColumnID=5),“”)
其中RowID=@Counter1
更新@refpivot
设置组_06=COALESCE((从@refunpivot中选择RefString,其中RowID=@Counter1,ColumnID=6),“”)
其中RowID=@Counter1
更新@refpivot
设置组_07=COALESCE((从@refunpivot中选择RefString,其中RowID=@Counter1,ColumnID=7),“”)
其中RowID=@Counter1
更新@refpivot
设置组_08=COALESCE((从@refunpivot中选择RefString,其中RowID=@Counter1,ColumnID=8),“”)
其中RowID=@Counter1
更新@refpivot
设置组_09=COALESCE((从@refunpivot中选择RefString,其中RowID=@Counter1,ColumnID=9),“”)
其中RowID=@Counter1
更新@refpivot
设置组_10=COALESCE((从@refunpivot中选择RefString,其中RowID=@Counter1,ColumnID=10),“”)
其中RowID=@Counter1
结束
从@refpivot中选择*
我不擅长透视表;这一点或许可以通过这些改进。我还为我的更新语句考虑了动态SQL,但我也不明白这一点。但这至少应该让你开始。还请记住,我无法使您的表值与您的说明完全一致,因此我做了对我最有意义的事情。从这里进行修改应该是相当基本的
以下是我得到的结果:
声明@ref表(RowID INT IDENTITY,ref_id NVARCHAR(20))
声明@refunpivot表(RowID INT、ColumnID INT、RefString NVARCHAR(20))
声明@refpivot表(RowID INT-IDENTITY)
,参考编号NVARCHAR(20)
,第01组NVARCHAR(20)
,第02组NVARCHAR(20)
,第03组NVARCHAR(20)
,第04组NVARCHAR(20)
,第05组NVARCHAR(20)
,第06组NVARCHAR(20)
,第07组NVARCHAR(20)
,第08组NVARCHAR(20)
,第09组NVARCHAR(20)
,第10组NVARCHAR(20)
)
插入@ref值
('21121212122233333333'),
('21222233333333333333'),
('22112212333333333333'),
('22213333333333333333')
声明@refstring NVARCHAR(20)
声明@Counter1 INT=0
声明@Counter2 INT=0
声明@Marker INT
当@Counter1<(从@ref中选择MAX(RowID)时,开始
设置@Counter1+=1
设置@refstring=(从
declare @t table (ref_id varchar(50)) insert into @t (ref_id) values
('21121212122233333333'),
('21222233333333333333'),
('22112212333333333333'),
('12213333333333333333')
declare @n varchar(max)
SELECT distinct ref_id
, S.a.value('(/t)[1]', 'VARCHAR(100)') AS Group_1
, S.a.value('(/t)[2]', 'VARCHAR(100)') AS Group_2
, S.a.value('(/t)[3]', 'VARCHAR(100)') AS Group_3
, S.a.value('(/t)[4]', 'VARCHAR(100)') AS Group_4
, S.a.value('(/t)[5]', 'VARCHAR(100)') AS Group_5
FROM
(
select ref_id, cast('<t>'+replace(replace(ref_id,'3',''),'21','2</t><t>1') +'</t>' as xml) as [val] from @t) d
CROSS APPLY d.[val].nodes('/t') S(a)