SQL серверный код для разделения 2 столбцов с разделителями на строки, используя порядок элементов - PullRequest
0 голосов
/ 09 января 2020

Имя таблицы: D_order

OrderID    OrderName    
11,12        A:B
13,14        C:D

Требуется вывод

OrderID      OrderName    
11               A
12               B
13               C
14               D

Ответы [ 3 ]

1 голос
/ 09 января 2020

Рекурсивная функция может помочь
проверить этот ответ { ссылка }

или Проверить эту скрипку http://sqlfiddle.com/#! 18 / f54fd / 10

;WITH tmp(OrderID, OrderName, String) AS
    (
        SELECT
            OrderID,
            OrderName,
            LEFT(String, CHARINDEX(',', String + ',') - 1),
            STUFF(String, 1, CHARINDEX(',', String + ','), '')
        FROM Testdata
        UNION all

        SELECT
            OrderID,
            OrderName,
            LEFT(String, CHARINDEX(',', String + ',') - 1),
            STUFF(String, 1, CHARINDEX(',', String + ','), '')
        FROM tmp
        WHERE
            String > ''
    )

    SELECT
        OrderID,
        OrderName, 
    FROM tmp
    ORDER BY OrderID


0 голосов
/ 09 января 2020

Если у вас SQL Server 2016+, вы можете попробовать подход, основанный на JSON. Просто преобразуйте данные в действительные массивы JSON и проанализируйте эти массивы с помощью OPENJSON(). Результат - это таблица со столбцами key, value и type, а столбец key содержит индекс элемента в этих массивах. При таком подходе вы можете анализировать более двух элементов.

Таблица:

CREATE TABLE Data (
   OrderID nvarchar(100),    
   OrderName nvarchar(100)
)
INSERT INTO Data
   (OrderID, OrderName)
VALUES   
   ('11,12', 'A:B'),
   ('13,14', 'C:D'),
   ('15,16,17,18', 'E:F:G:H')

Оператор:

SELECT j1.[value] AS OrderId, j2.[value] AS OrderName
FROM Data d
CROSS APPLY OPENJSON(CONCAT(N'[', d.OrderId, N']')) j1
CROSS APPLY OPENJSON(CONCAT(N'["', REPLACE(d.OrderName, N':', N'","'), N'"]')) j2
WHERE j1.[key] = j2.[key]

Результат:

-----------------
OrderId OrderName
-----------------
11      A
12      B
13      C
14      D
15      E
16      F
17      G
18      H   
0 голосов
/ 09 января 2020

Вы должны разделить строки и создать объединение. Я использовал подход для разбиения строки, описанный здесь .

Код:

SELECT substring(OrderId, 1, CHARINDEX(',',OrderId)-1) OrderId,
       substring(OrderName, 1, CHARINDEX(':',OrderName)-1) OrderName
  FROM YourDataTable

UNION ALL

SELECT substring(OrderId, CHARINDEX(',',OrderId)+1, LEN(OrderId)),
   substring(OrderName, CHARINDEX(':',OrderName)+1, LEN(OrderName))
  FROM YourDataTable

Работает только для форматирования в данных образца.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...