SQL中的字符串拆分功能

时间:2019-05-23 20:39:19

标签: sql sql-server

我正在使用一个大型数据库,该数据库使用两列链接客户信息:co_code和i_code。当我们从较旧的系统传输数据时,co_code包括我们客户的新ID。 i_code是先前的客户机ID,其信息在数据系统中仍然相关,我需要为我正在创建的报告提取该信息。

但是,i_code列有时具有多个ID,这些ID属于同一新的co_code ID。例如:

+---------+---------------------------+
| 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 |  
+---------+---------------------------+

我尝试了一系列不同的字符串拆分变体。我最近的是:

从Prod_Detail中选择co_code,i_Code i_code所在的位置(从string_split('i_code',',')中选择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 个答案:

答案 0 :(得分:1)

如果您使用的是SQL Server 2016或更高版本,则可以使用STRING_SPLIT function

请参见以下示例:

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, ',');  
相关问题