Функция разделения строк в SQL - PullRequest
0 голосов
/ 23 мая 2019

Я работаю с большой базой данных, которая связывает информацию о клиенте, используя два столбца: co_code и i_code. co_code включает новые идентификаторы для наших клиентов, когда мы передаем данные из более старой системы. i_code - это предыдущий идентификатор клиента с информацией, которая по-прежнему актуальна в системе данных, которую мне нужно получить для создаваемого отчета.

Однако столбец i_code иногда имеет несколько идентификаторов, которые попадают под один и тот же новый идентификатор co_code. Например:

+---------+---------------------------+
| co_code |          i_code           |  
+---------+---------------------------|
|       1 |                       768 |  
|       2 |              134,4546,234 |  
|       3 |                      2354 |  
|       4 |                3454,65465 |  
|       5 | 432,76878,3543,43546,3435 |  
|       6 |                 535,65765 |  
|       7 |                      6345 |  
|       8 |                      1675 |  
|       9 |                       256 |  
|      10 |            3768,6585,4654 |  
+---------+---------------------------+

Я пробовал серию различных вариантов разделения строк. Мой самый последний:

выберите co_code, i_Code из Prod_Detail где i_code in (выберите i_Code из string_split ('i_code', ','))

Пока что мне не повезло с разделением строк, если я не сделаю каждый отдельный ряд отдельно. Поскольку я работаю с тысячами строк, это невозможно в течение небольшого периода времени.

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


+---------+--------+
| co_code | i_code |  
+---------+--------+
|       1 |    768 |  
|       2 |    134 |  
|       2 |   4546 |  
|       2 |    234 |  
|       3 |   2354 |  
|       4 |   3454 |  
|       4 |  65465 |  
|       5 |    432 |  
|       5 |  76878 |  
|       5 |   3543 |  
|       5 |  43546 |  
|       5 |   3435 |  
|       6 |    535 |  
|       6 |  65765 |  
|       7 |   6345 |  
|       8 |   1675 |  
|       9 |    256 |  
|      10 |   3768 |  
|      10 |   6585 |  
|      10 |   4654 |  
+---------+--------+

1 Ответ

1 голос
/ 24 мая 2019

Если вы используете SQL Server 2016 или более позднюю версию, вы можете использовать функцию STRING_SPLIT

См. Пример ниже:

create table #code(co_code int, i_code varchar(max));
insert into #code(co_code, i_code)
values(1, '2,3,4'),(2, '3,4,5');

SELECT co_code, value as i_code_new
FROM #code
    CROSS APPLY STRING_SPLIT(i_code, ',');  

Если вы используете более старую версиюSQL, вам придется написать функцию split самостоятельно или использовать одну из следующих:

CREATE FUNCTION [dbo].[udfSplitString]
(
    @List VARCHAR(MAX),
    @Delim VARCHAR(2)
)
RETURNS TABLE
AS
    RETURN ( SELECT [Value] FROM 
      ( 
        SELECT 
          [Value] = LTRIM(RTRIM(SUBSTRING(@List, [Number],
          CHARINDEX(@Delim, @List + @Delim, [Number]) - [Number])))
        FROM (SELECT Number = ROW_NUMBER() OVER (ORDER BY name)
          FROM sys.all_objects) AS x
          WHERE Number <= LEN(@List)
          AND SUBSTRING(@Delim + @List, [Number], LEN(@Delim)) = @Delim
      ) AS y
    );

Затем вы можете использовать ее так же, как и при STRING_SPLIT:

SELECT co_code, value as i_code_new
FROM #code
    CROSS APPLY [udfSplitString](i_code, ',');  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...