Получить строки из списка через запятую - PullRequest
0 голосов
/ 30 апреля 2020

Я хочу преобразовать разделенный запятыми список обратно в таблицу.

Например,

У меня есть таблица, которая выглядит следующим образом

Sid  roleid
  500    1,5,
  501    1,5,6,

Я хочу вывод, как это

Sid roleid
500   1
500   5
501   1
501   5
501   6

Пожалуйста, помогите.

Create table #temp(Sid int,roleid varchar(100))
Insert into #temp values(500,'1,5,'),(501,'1,5,6,')

Ответы [ 3 ]

2 голосов
/ 04 мая 2020

Использование STRING_SPLIT() означает, что вы работаете на SQL Server 2016 (на порядок выше).

Однако, STRING_SPLIT() имеет огромный недостаток: возврат гарантированных предметов не гарантирован. ожидаемый порядок (см. документы, раздел «Примечания» ). На мой взгляд, это абсолютный ограничитель шоу ...

Но - к счастью - в v2016 + есть быстрый и простой в использовании обходной путь:

Create table #temp(Sid int,roleid varchar(100))
Insert into #temp values(500,'1,5,'),(501,'1,5,6,');

SELECT t.[Sid]
      ,A.[key] AS position
      ,A.[value] AS roleid
FROM #temp t
CROSS APPLY OPENJSON(CONCAT('["',REPLACE(t.roleid,',','","'),'"]')) A
WHERE A.[value]<>'';

Простой массив чисел 1,3,5 не требуется ничего, кроме скобок, чтобы быть массивом JSON ([1,3,5]). В вашем случае, из-за запятой, я рассматриваю это как строки. 1,3,5, будет приниматься как массив строк: ["1","3","5",""]. Последняя пустая строка удаляется предложением WHERE. Остальное легко ...

Кроме STRING_SPLIT() документов доказательство того, что OPENJSON будет отражать позицию элемента в столбце [key]:

Когда OPEN JSON анализирует массив JSON, функция возвращает индексы элементов в тексте JSON в качестве ключей.

Общая подсказка: избегайте STRING_SPLIT() как lons поскольку в его результирующий набор не добавлен дополнительный столбец ключа / позиции.

1 голос
/ 30 апреля 2020

Использование string_split():

select t.sid, spt.value
from table t cross apply
     string_split(t.roleid, ',') as spt
order by t.sid, spt.value;
1 голос
/ 30 апреля 2020

Использование sring_split():

select t.sid, value rid
from t
cross apply string_split(t.roleid, ',') rid
order by t.sid, rid
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...