循环遍历特定 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

Demo on DB Fiddle:

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 只是为了删除数组的闭包。