循环遍历特定 ID 的数字数组 - sql
Looping through array of numbers for a specific id - sql
这是我的情况:
我可以成功地拆分一个整数数组,但我遇到了一个障碍,我不确定如何将列表中的每个项目分配给给定的 id
DECLARE @position INT
DECLARE @arrayList varchar(8000)
DECLARE @len INT
DECLARE @value varchar(8000)
SET @arrayList = '1,2,3,4,5'
IF @arrayList NOT LIKE '%,'
BEGIN
set @arrayList = @arrayList + ','
END
SET @position = 0
set @len = 0
WHILE CHARINDEX(',', @arrayList, @position+1)>0
BEGIN
SET @len = CHARINDEX(',', @arrayList, @position+1) - @position
SET @value = SUBSTRING(@arrayList, @position, @len)
PRINT @value
SET @position = CHARINDEX(',', @arrayList, @position+@len) +1
END
描绘一下我的问题是什么:
我需要为每个 id
遍历一个 arrayList
以便它可以像下面的结果一样显示。
Table1
id arrayList
23 [1,2,3]
47 [2,4,6]
Outcome
id arrayList
23 1
23 2
23 3
47 2
47 4
47 6
我是否需要做某种 while 循环来检查 id
在循环时是否仍然是 23
,然后在最后一个数字已经出现时移动到下一个 id
从数组中显示?
为什么不直接使用 json 个函数?
select t1.id, v.value
from table1 t1
cross apply openjson(t.arraylist) v
select t.id, v.value
from (values (23, '[1,2,3]'), (47, '[2,4,6]')) as t(id, arraylist)
cross apply openjson(t.arraylist) v
id | value
-: | :----
23 | 1
23 | 2
23 | 3
47 | 2
47 | 4
47 | 6
如果您使用的是 MS SQL Server 2016 及更高版本,您可以使用 STRING_SPLIT
作为您的解决方案。
STRING_SPLIT is a table-valued function that splits a string into rows of substrings,
based on a specified separator character.
然后你可以这样写语句:
WITH CleanArrayCTE AS
(
SELECT id, REPLACE(REPLACE(arrayList, ']', ''), '[', '') as arrayList
FROM Table1
)
SELECT id, value
FROM CleanArrayCTE CA
CROSS APPLY (SELECT value FROM STRING_SPLIT(CA.arrayList, ',')) r;
我在这里使用 CTE
只是为了删除数组的闭包。
这是我的情况:
我可以成功地拆分一个整数数组,但我遇到了一个障碍,我不确定如何将列表中的每个项目分配给给定的 id
DECLARE @position INT
DECLARE @arrayList varchar(8000)
DECLARE @len INT
DECLARE @value varchar(8000)
SET @arrayList = '1,2,3,4,5'
IF @arrayList NOT LIKE '%,'
BEGIN
set @arrayList = @arrayList + ','
END
SET @position = 0
set @len = 0
WHILE CHARINDEX(',', @arrayList, @position+1)>0
BEGIN
SET @len = CHARINDEX(',', @arrayList, @position+1) - @position
SET @value = SUBSTRING(@arrayList, @position, @len)
PRINT @value
SET @position = CHARINDEX(',', @arrayList, @position+@len) +1
END
描绘一下我的问题是什么:
我需要为每个 id
遍历一个 arrayList
以便它可以像下面的结果一样显示。
Table1
id arrayList
23 [1,2,3]
47 [2,4,6]
Outcome
id arrayList
23 1
23 2
23 3
47 2
47 4
47 6
我是否需要做某种 while 循环来检查 id
在循环时是否仍然是 23
,然后在最后一个数字已经出现时移动到下一个 id
从数组中显示?
为什么不直接使用 json 个函数?
select t1.id, v.value
from table1 t1
cross apply openjson(t.arraylist) v
select t.id, v.value
from (values (23, '[1,2,3]'), (47, '[2,4,6]')) as t(id, arraylist)
cross apply openjson(t.arraylist) v
id | value -: | :---- 23 | 1 23 | 2 23 | 3 47 | 2 47 | 4 47 | 6
如果您使用的是 MS SQL Server 2016 及更高版本,您可以使用 STRING_SPLIT
作为您的解决方案。
STRING_SPLIT is a table-valued function that splits a string into rows of substrings, based on a specified separator character.
然后你可以这样写语句:
WITH CleanArrayCTE AS
(
SELECT id, REPLACE(REPLACE(arrayList, ']', ''), '[', '') as arrayList
FROM Table1
)
SELECT id, value
FROM CleanArrayCTE CA
CROSS APPLY (SELECT value FROM STRING_SPLIT(CA.arrayList, ',')) r;
我在这里使用 CTE
只是为了删除数组的闭包。