如何在SQL Server 2012中动态替换表中的所有值?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在SQL Server 2012中动态替换表中的所有值?相关的知识,希望对你有一定的参考价值。

我目前的桌子就像enter image description here

其中UserId有14个列,从ys_ar_item1ys_ar_item14,适用于多个客户。我必须更改或更新此表中的值,使0应替换为1,1应替换为2,2应替换为3,最多6应替换为7,nil应替换为0。

例如:ys_ar_item1应该是31245而不是20134。

这是3列的Sample表,它将是14的所有列。

enter image description here

注意 - 用UserId和14列创建一个新表是没关系的。

答案

就像已经提到的,这是一个糟糕的数据库设计。但您可以尝试以下函数来获得所需的结果:

CREATE FUNCTION ReplaceNumbers
(
    @str varchar(max)
)
RETURNS varchar(max)
AS
BEGIN

DECLARE @result varchar(max)
DECLARE @cnt int=1
WHILE @cnt <= LEN(@str)
    BEGIN
        SET @result = CONCAT(@result,
                            CASE WHEN SUBSTRING(@str,@cnt,1) IN ('0','1','2','3','4','5','6')
                            THEN CAST(PARSE(SUBSTRING(@str,@cnt,1) AS int)+1 AS varchar)
                            ELSE SUBSTRING(@str,@cnt,1) END)

        SET @cnt = @cnt + 1
    END;

RETURN REPLACE(@result, 'nil', '0')
END

像这样使用它:

UPDATE myTable SET ys_ar_item1=dbo.ReplaceNumbers(ys_ar_item1)
另一答案

这是非常糟糕的设计,你将数字存储为字符串使事情变得困难,但我可以想到使用这些函数IIF()TRY_CAST()REPLICATE()

CREATE TABLE Sample (
    UserID INT,
    Ys_Ar_Item1 VARCHAR(10),
    Ys_Ar_Item2 VARCHAR(10),
    Ys_Ar_Item3 VARCHAR(10)
    -- Other columns
    );

INSERT INTO Sample VALUES
(1, '20134', 'nil NULL', '02341');

SELECT UserID,
       IIF(TRY_CAST(Ys_Ar_Item1 AS INT) IS NULL, '0', CAST( REPLICATE('1', LEN(Ys_Ar_Item1) ) AS INT) + CAST(Ys_Ar_Item1 AS INT)) AS Ys_Ar_Item1,
       IIF(TRY_CAST(Ys_Ar_Item2 AS INT) IS NULL, '0', CAST( REPLICATE('1', LEN(Ys_Ar_Item2) ) AS INT) + CAST(Ys_Ar_Item2 AS INT)) AS Ys_Ar_Item2,
       IIF(TRY_CAST(Ys_Ar_Item3 AS INT) IS NULL, '0', CAST( REPLICATE('1', LEN(Ys_Ar_Item3) ) AS INT) + CAST(Ys_Ar_Item3 AS INT)) AS Ys_Ar_Item3
FROM Sample;

注意:

在您作为图像的问题中包含的示例数据中,没有数字> 6,如果您有这样的数字,此解决方案将失败。

以上是关于如何在SQL Server 2012中动态替换表中的所有值?的主要内容,如果未能解决你的问题,请参考以下文章

如何将sql server 数据库表中的某一列的某一字符替换成需要的字符

sql server 查询 order by 与 union 并替换多个列的空值

如何从MS SQL Server 2012中的不同表中减去连续的行?

SQL Server:如何在表数据中用单引号查找和替换多引号

如何循环在 SQL Server 中动态创建的查询

如何在 SQL Server 表中添加“最后修改”和“创建”列?