Если вы хотите получить все возможные комбинации, используйте STRING_SPLIT()
и три CROSS APPLY
оператора:
Ввод:
CREATE TABLE #Data (
ID int,
[Name List1] varchar(100),
[Name List2] varchar(100),
[Name List3] varchar(100)
)
INSERT INTO #Data
(ID, [Name List1], [Name List2], [Name List3])
VALUES
(1, 'a1,a2,a3', 'a21,a22', 'a31,a32,a33,a34,a45'),
(2, 'b1,b2', 'b21,b22,b23,b24', 'b31')
T-SQL:
SELECT
d.ID,
s1.[value] AS [Name List1],
s2.[value] AS [Name List2],
s3.[value] AS [Name List3]
FROM #Data d
CROSS APPLY STRING_SPLIT(d.[Name List1], ',') s1
CROSS APPLY STRING_SPLIT(d.[Name List2], ',') s2
CROSS APPLY STRING_SPLIT(d.[Name List3], ',') s3
Вывод:
ID Name List1 Name List2 Name List3
1 a1 a21 a31
1 a1 a21 a32
1 a1 a21 a33
1 a1 a21 a34
1 a1 a21 a45
1 a1 a22 a31
1 a1 a22 a32
1 a1 a22 a33
1 a1 a22 a34
1 a1 a22 a45
…
Если вы хотите получить все возможные комбинации с позициями каждой подстроки, то STRING_SPLIT()
здесь не вариант, потому что эта функция возвращает таблицу со всеми подстроками, но онине упорядочены и порядок подстрок не гарантируется.Одним из вариантов в этом случае является преобразование текста в действительный массив JSON
с использованием REPLACE()
, а затем использование OPENJSON()
со схемой по умолчанию для извлечения этого массива JSON
в виде таблицы, в которой есть столбцы key
, value
и type
(столбец key
содержит индекс элемента в указанном массиве).
T-SQL:
SELECT
d.ID,
j1.[key] + 1 AS [Key List1], j1.[value] AS [Name List1],
j2.[key] + 1 AS [Key List2], j2.[value] AS [Name List2],
j3.[key] + 1 AS [Key List3], j3.[value] AS [Name List3]
FROM #Data d
CROSS APPLY OPENJSON('["' + REPLACE(d.[Name List1], ',', '","') + '"]') j1
CROSS APPLY OPENJSON('["' + REPLACE(d.[Name List2], ',', '","') + '"]') j2
CROSS APPLY OPENJSON('["' + REPLACE(d.[Name List3], ',', '","') + '"]') j3
Вывод:
ID Key List1 Name List1 Key List2 Name List2 Key List3 Name List3
1 1 a1 1 a21 1 a31
1 1 a1 1 a21 2 a32
1 1 a1 1 a21 3 a33
1 1 a1 1 a21 4 a34
1 1 a1 1 a21 5 a45
1 1 a1 2 a22 1 a31
1 1 a1 2 a22 2 a32
1 1 a1 2 a22 3 a33
1 1 a1 2 a22 4 a34
1 1 a1 2 a22 5 a45
…