我正在使用SQL Server 2014数据库,并且我有一个包含逗号分隔值的列,例如:
1,2,3
4,5
3,6,2
4,2,8
2
我需要做的是将每个记录中的数字2替换为数字3(字符串值),如果可能,不要复制3。我不确定这可以做到,除非我使用一个函数,我不知道如何在函数中做到这一点。
我认为我需要将一个字符串拆分成一个表,然后循环这些值并将其与新值一起重新组合。有没有更简单的方法?任何帮助表示赞赏。
预计输出将是:
1,3
4,5
3,6
4,3,8
3
答案 0 :(得分:2)
虽然有可能, 我不鼓励这个 :
DECLARE @old AS VARCHAR(3) = '2';
DECLARE @new AS VARCHAR(3) = '3';
WITH opdata(csv) AS (
SELECT '1,22,3' UNION ALL
SELECT '1,2,3' UNION ALL
SELECT '4,5' UNION ALL
SELECT '3,6,2' UNION ALL
SELECT '4,2,8' UNION ALL
SELECT '2'
), cte1 AS (
SELECT
csv,
CASE
WHEN ',' + csv + ',' LIKE '%,' + @old + ',%' THEN
CASE
WHEN ',' + csv + ',' LIKE '%,' + @new + ',%' THEN REPLACE(',' + csv + ',', ',' + @old + ',', ',') -- new already present so just delete old
ELSE REPLACE(',' + csv + ',', ',' + @old + ',', ',' + @new + ',') -- replace old with new
END
ELSE ',' + csv + ','
END AS tmp
FROM opdata
)
SELECT
csv,
STUFF(STUFF(tmp, 1, 1, ''), LEN(tmp) - 1, 1, '') AS res
FROM cte1
结果:
csv | res
-------+-------
1,22,3 | 1,22,3
1,2,3 | 1,3
4,5 | 4,5
3,6,2 | 3,6
4,2,8 | 4,3,8
2 | 3
请注意,需要过多的',...,'
来避免替换22之类的值。如果您使用的是SQL Server 2017,则可以抛弃额外的CTE + STUFF并使用TRIM(',' FROM ...)
。
答案 1 :(得分:1)
然而,这不会表现得特别好:
WITH CTE AS (
SELECT *
FROM (VALUES ('1,2,3'),
('4,5'),
('3,6,2'),
('4,2,8'),
('2')) V(DS))
SELECT CASE WHEN DS LIKE '%3%' THEN REPLACE(REPLACE(DS,'2,',''),',2','')
WHEN DS LIKE '%2%' THEN REPLACE(DS,'2','3')
ELSE DS
END
FROM CTE;
答案 2 :(得分:1)
可能你看起来像这样。
SELECT REPLACE(CASE WHEN CHARINDEX('2', '1,2,3') > 0 THEN REPLACE('1,2,3', '2','') ELSE REPLACE('1,2,3', '2','3') END, ',,',',')
我已经采用了硬编码值进行演示。您可以使用表中的列名替换'1,2,3'
。
答案 3 :(得分:0)
更新:
DECLARE @was nvarchar(2) = 2,
@willbe nvarchar(2) = 3,
@d nvarchar(1) = ','
UPDATE strings
SET string = REVERSE(
STUFF(
REVERSE(
STUFF(
CASE WHEN CHARINDEX(@d+@willbe+@d,@d+string+@d) > 0
THEN REPLACE(@d+string+@d,@d+@was+@d,@d)
ELSE REPLACE(@d+string+@d,@d+@was+@d,@d+@willbe+@d)
END,1,1,'')
),1,1,''))
输出:
1,3
4,5
3,6
4,3,8
3