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

时间:2017-12-19 12:07:40

标签: sql-server sql-server-2012

我目前的表就像 enter image description here

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

例如:ys_ar_item1应为31245而不是20134.

以下是3列的Sample表,它将适用于14的所有列。

enter image description here

注意 - 可以创建一个包含UserId和14列的新表。

2 个答案:

答案 0 :(得分:1)

这是非常糟糕的设计,你将数字存储为字符串会使事情变得困难,但我只能考虑使用这些函数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,如果您有这样的数字,此解决方案将失败。

答案 1 :(得分:1)

如前所述,这是一个糟糕的数据库设计。 但您可以尝试以下函数来获得所需的结果:

UPDATE myTable SET ys_ar_item1=dbo.ReplaceNumbers(ys_ar_item1)

像这样使用:

Books