用逗号分隔符分隔列

时间:2019-07-05 05:33:42

标签: sql sql-server tsql split

我有一个3列的表格,下面是数据。

ID |  Col1        |         Col2            |   Status
1     8007590006    8002240001,8002170828        I
2     8002170828    8002000004                   I
3     8002000001    8002240001                   I
4     8769879809    8002000001                   I
5     8769879809    8002000001                   I

Col2可以包含多个逗号分隔的值。如果col2中也有一个值,那么我需要将状态更新为C。

例如,对于col1ID = 1包含col2,它存在于8002170828Col1中。因此,状态='C'

根据我的尝试,我知道在有多个值的地方将无法使用,因为我需要拆分数据并获取单个值,然后应用更新。

ID = 2

2 个答案:

答案 0 :(得分:4)

如果您使用的是SQL Server 2016或更高版本,那么STRING_SPLIT会派上用场:

WITH cte AS (
    SELECT ID, Col1, value AS Col2
    FROM Table1
    CROSS APPLY STRING_SPLIT(Col2, ',')
)

UPDATE t1
SET Status = 'C'
FROM Table1 t1
INNER JOIN cte t2
    ON t1.Col1 = t2.Col2;

enter image description here

Demo

答案 1 :(得分:3)

此答案是对Tim答案的补充

由于您没有在2016年进行的本机字符串拆分,因此我们可以做一个:

CREATE FUNCTION dbo.STRING_SPLIT
(
   @List       NVARCHAR(MAX),
   @Delimiter  NVARCHAR(255)
)
RETURNS TABLE
WITH SCHEMABINDING
AS
   RETURN 
   (  
      SELECT y.i.value('(./text())[1]', 'nvarchar(4000)') as value
      FROM 
      ( 
        SELECT x = CONVERT(XML, '<i>' 
        + REPLACE(@List, @Delimiter, '</i><i>') 
        + '</i>').query('.')
      ) AS a CROSS APPLY x.nodes('i') AS y(i)
   );
GO

--credits to sqlserverperfomance.com for the majority of this code - https://sqlperformance.com/2012/07/t-sql-queries/split-strings

现在,蒂姆(Tim)的答案应该可以为您解决,所以我无需在这里重复

我选择了一种基于xml的方法,因为它性能良好,并且您的数据看起来很健全,并且其中没有任何xml字符。如果它包含像>这样的xml字符,则会破坏解析,应该将它们转义,然后在拆分后不转义

如果不允许执行函数,则可以提取RETURNS和GO之间的所有内容,将其插入Tim的查询中,将变量名调整为列名,这样仍然可以解决