替换SQL Server数据库

时间:2017-12-15 11:59:32

标签: sql sql-server database sql-server-2014

我正在使用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

4 个答案:

答案 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