Разделить строку со значением и критериями заказа - PullRequest
0 голосов
/ 11 октября 2019

Привет, я бы хотел помочь с разбиением строк в Таблице 1:

  ID           Level    Options          OptionCodes
  A5CF-601     G;8      1,2,3            4958,2669,26
  88C0-0EA     G;9      1,2,3,4,5,6,7,8  2669,21,670,267,13,738,85,55
  BE95-196     G;6      Q,L,S,T          6705,6694,6693,6691

После разделения обоих 'Опции' и 'ОпцииCode' мне нужно объединить 'level' с каждым значением из 'Options' с'-'. Затем свяжите каждую конкатенацию с 'OptionCodes' в том же порядке, в каком они отображаются в строке.

Желаемый результат будет следующим:

 LevelOption   OptionCode
 G;8 - 1       4958     
 G;8 - 2       2669     
 G;8 - 3       26       
 G;9 - 1       2669     
 G;9 - 2       21       
 G;9 - 3       760      
 G;9 - 4       267      
 G;9 - 5       13       
 G;9 - 6       738      
 G;9 - 7       85       
 G;9 - 8       55       
 G;6 - Q       6705     
 G;6 - L       6694     
 G;6 - S       6693     
 G;6 - T       6691 

Я сделал несколько попыток с помощью string_split, substring,charindex и т. д. Но я все еще не могу понять это. У меня есть одно ограничение на использование SQL-сервера: у меня нет прав на создание функций, что делает его более сложным. В любом случае, спасибо за вашу помощь и терпение.

1 Ответ

3 голосов
/ 11 октября 2019

STRING_SPLIT не возвращает позицию индекса подстрок. Неуклюжее решение состоит в том, чтобы использовать CHARINDEX, чтобы определить местоположение подстроки внутри основной строки и использовать результат для нумерации подстрок. К сожалению, для этого необходимо, чтобы строка не содержала повторяющихся подстрок.

Запрос будет выглядеть следующим образом:

WITH cte AS (
    SELECT ID
         , Level
         , o.value AS ov
         , c.value AS ocv
         , DENSE_RANK() OVER (PARTITION BY ID ORDER BY CHARINDEX(',' + o.value + ',', ',' + Options + ',')) AS rn1
         , DENSE_RANK() OVER (PARTITION BY ID ORDER BY CHARINDEX(',' + c.value + ',', ',' + OptionCodes + ',')) AS rn2
    FROM t
    CROSS APPLY STRING_SPLIT(Options, ',') AS o
    CROSS APPLY STRING_SPLIT(OptionCodes, ',') AS c
)
SELECT *
FROM cte
WHERE rn1 = rn2

Демонстрация в db <> fiddle

...