#sql-server #split #resultset
#sql-сервер #разделить #набор результатов
Вопрос:
У меня есть таблица с 3 столбцами: col1, col2, col3. Мне нужно вставить строки в эту таблицу, и мои входные данные — это 3 параметра, один параметр int и два параметра varchar, которые мне нужно разделить. Так, например
@param1 = 1
@param2 = '2,3'
@param3 = '4,5'
должны быть созданы следующие строки
1,2,4
1,3,5
Я попытался приблизиться к желаемому результату с помощью такого кода
WITH group1 AS (
SELECT @param1 as col1, value as col2 from string_split(@param2,',')
),
group2 AS (
SELECT @param1 as col1, value as col3 from string_split(@param3,',')
)
SELECT group1.col1, group1.col2, group2.col3
FROM group1
JOIN group2 ON group1.col1 = group2.col1
но это не совсем то, что я хочу.
Комментарии:
1. Есть
@param2
и@param3
всегда иметь 2 подстроки?2. нет, у них может быть много и всегда одинаковое количество подстрок
3. какую версию sql-сервера вы используете?
Ответ №1:
Вам нужен разделитель, который возвращает каждую подстроку и позицию подстроки. Иногда может помочь подход, основанный на JSON. Вам необходимо преобразовать строки, разделенные запятыми, в допустимые массивы JSON ( 2,3
into [2,3]
), проанализировать массивы с OPENJSON()
помощью и использовать соответствующий JOIN
:
DECLARE @param1 int = 1
DECLARE @param2 varchar(100) = '2,3,6,8'
DECLARE @param3 varchar(100) = '4,5,9,5'
-- INSERT INTO Table1 (Column1, Column2, Column3)
SELECT
@param1 AS Column1,
j1.[value] AS Column2,
j2.[value] AS Column3
FROM OPENJSON (CONCAT('[', @param2, ']')) j1
FULL JOIN OPENJSON (CONCAT('[', @param3, ']')) j2 ON j1.[key] = j2.[key]
Результат:
Column1 Column2 Column3
1 2 4
1 3 5
1 6 9
1 8 5
В качестве важного примечания (хотя STRING_SPLIT()
строка разбивается на строки и возвращает таблицу), как указано в документации, выходные строки могут располагаться в любом порядке, и порядок не гарантируется, чтобы соответствовать порядку подстрок во входной строке.
Комментарии:
1. О нет, тогда я не могу использовать string_split в моем сценарии. Есть ли какая-либо другая встроенная функция, такая как string_split, или мне нужно создать свою собственную?
2. @KonstantinosPapakonstantinou Здесь много примеров о том, как разделить строку. И да, вам нужно использовать существующую или создать свою собственную функцию.