如何在SQL Server 2012中动态替换表中的所有值?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在SQL Server 2012中动态替换表中的所有值?相关的知识,希望对你有一定的参考价值。
其中UserId
有14个列,从ys_ar_item1
到ys_ar_item14
,适用于多个客户。我必须更改或更新此表中的值,使0应替换为1,1应替换为2,2应替换为3,最多6应替换为7,nil
应替换为0。
例如:ys_ar_item1
应该是31245而不是20134。
这是3列的Sample表,它将是14的所有列。
注意 - 用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中的不同表中减去连续的行?