我有一个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。
例如,对于col1
,ID = 1
包含col2
,它存在于8002170828
,Col1
中。因此,状态='C'
根据我的尝试,我知道在有多个值的地方将无法使用,因为我需要拆分数据并获取单个值,然后应用更新。
ID = 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;
答案 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的查询中,将变量名调整为列名,这样仍然可以解决