Разделить SQL строку с указанием c строки вместо разделителя? - PullRequest
0 голосов
/ 12 января 2020

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

|ID  | String
|546 | 1,2,1,5,7,8
|486 | 2,4,8,1,5,1
|465 | 18,11,20,1,4,18,11
|484 | 11,10,11,12,50,11

Я хочу разбить строку на это:

|ID  | String
|546 | 1,2
|546 | 1,5
|486 | 1,5,1
|486 | 1
|465 | 1,4

Моя цель - показать ID и все строки, начинающиеся с 1 после следующего числа.

Я отфильтровал все строки без '%1,%', и я не знаю, как продолжить.

Ответы [ 2 ]

2 голосов
/ 12 января 2020

Если вы используете SQL Server 2016+, вы можете попробовать использовать JSON подход. Вам необходимо преобразовать данные в действительный массив JSON и проанализировать массив JSON с помощью OPENJSON(). Обратите внимание, что STRING_SPLIT() здесь не вариант, потому что, как указано в документации, выходные строки могут быть в любом порядке, и порядок не обязательно соответствует порядку подстрок во входной строке .

Таблица:

CREATE TABLE Data (
   ID int,
   [String] varchar(100)
)
INSERT INTO Data
   (ID, [String])
VALUES   
   (546, '1,2,1,5,7,8'),
   (486, '2,4,8,1,5,1'),
   (465, '18,11,20,1,4,18,11'),
   (484, '11,10,11,12,50,11')

Заявление:

SELECT
   ID,
   CONCAT(FirstValue, ',', SecondValue) AS [String]
FROM (   
   SELECT 
      d.ID, 
      j.[value] As FirstValue, 
      LEAD(j.[value]) OVER (PARTITION BY d.ID ORDER BY CONVERT(int, j.[key])) AS SecondValue
   FROM Data d
   CROSS APPLY OPENJSON(CONCAT('[', d.[String], ']')) j
) t
WHERE t.FirstValue = '1'

Результат:

----------
ID  String
----------
465 1,4
486 1,5
486 1,
546 1,2
546 1,5
0 голосов
/ 13 января 2020

Что-то вроде:

SELECT ID, S.value
FROM   Data
       CROSS APPLY STRING_SPLIT(REPLACE(',' + String, ',1,', '#1,'), '#') AS S
WHERE  value LIKE '1,%'

?

...