【问题标题】:Split a column with comma delimiter使用逗号分隔符拆分列
【发布时间】:2019-07-05 05:33:42
【问题描述】:

我有一个包含 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 中的值也存在于col1 中,我需要将状态更新为C。

例如,对于ID = 1col2 包含存在于Col1ID = 2 中的8002170828。所以,状态 = 'C'

根据我的尝试,我知道它在有多个值的情况下不起作用,因为我需要拆分该数据并获取单个值然后应用更新。

UPDATE Table1
SET STATUS = 'C' 
WHERE Col1 IN (SELECT Col2 FROM Table1)

【问题讨论】:

  • Col2 中的 CSV 值是否可以超过两个?
  • @tim 我想是的 - 他说 Col2 可以包含多个逗号分隔的值
  • @geek 请问什么版本的sql server?交叉应用字符串拆分将使这变得轻而易举,但仅在 2016+ 中可用
  • @TimBiegeleisen 是的。它可以包含多个值。 1 或 2 或 3 或任何数字。未修复。
  • @CaiusJard 我正在使用 2014 年

标签: sql sql-server tsql split


【解决方案1】:

如果您使用的是 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;

Demo

【讨论】:

  • 我使用的是 SQL Server 2014。这就是我卡住的原因。
【解决方案2】:

此答案旨在补充蒂姆的答案

由于您没有 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

现在蒂姆的答案应该适合你,所以我不需要在这里重复了

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

如果您不允许创建函数,您可以提取 RETURNS 和 GO 之间的所有内容,将其插入到 Tim 的查询中,将变量名调整为列名,它仍然可以工作

【讨论】:

  • 不,我的问题是我在演示中将Table1 定义为CTE,无法更新。一旦我定义了一个真正的表,它就起作用了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-07
  • 1970-01-01
  • 2018-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多