我正在使用一个大型数据库,该数据库使用两列链接客户信息: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 |
+---------+--------+
答案 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, ',');