我已经创建了如下所示的更新声明
UPDATE dbo.S_Item
SET SalePrice3 = CASE WHEN Price <0 THEN '-1'
when Price=1 then 11
when Price=2 then 22
when Price=3 then 33
when Price=4 then 44
when Price=5 then 55
when Price=6 then 66
when Price=7 then 77
when Price=8 then 88
when Price=9 then 99
when Price=0 then 00
end
但我希望使用上述语句更新更多值,例如,如果想要更新价格= 123则必须更新112233,如果价格= 456则必须更新445566,如果价格= 725则必须更新772255如何才能实现此帮助我
答案 0 :(得分:3)
Create Function ReplicateDigits (
@Number Int)
Returns BigInt
Begin
Declare @Step SmallInt = 1,
@Result nVaRchar(100) = N''
While (@Step <= Len(@Number))
Begin
Select @Result = @Result + Replicate(SubString(Cast(@Number As Varchar), @Step, 1), 2)
Select @Step = @Step + 1
End
Return Cast(@Result As BigInt)
End
Go
然后:
UPDATE dbo.S_Item
SET SalePrice3 = CASE
WHEN Price <0 THEN '-1'
Else dbo.ReplicateDigits(Price)
End
让我知道它是否有用。
答案 1 :(得分:1)
如果重点是每个数字,这里是复制方法的另一个实现:
CREATE FUNCTION dbo.DuplicateDigits(@Input int)
RETURNS varchar(20)
AS
BEGIN
DECLARE @Result varchar(20) = CAST(@Input AS varchar(20));
DECLARE @Pos int = LEN(@Result);
WHILE @Pos > 0
BEGIN
SET @Result = STUFF(@Result, @Pos, 0, SUBSTRING(@Result, @Pos, 1));
SET @Pos -= 1;
END;
RETURN @Result;
END;
该方法包括向后迭代数字,使用SUBSTRING
提取每个数字并使用STUFF
复制数字。
你将使用与Meysam Tolouee's answer相同的功能:
UPDATE dbo.S_Item
SET SalePrice3 = CASE
WHEN Price < 0 THEN '-1'
ELSE dbo.DuplicateDigits(SalePrice3)
END;
为了解释为什么函数的返回类型为varchar
,这是因为无论输入的[合理]长度是什么,都能保证函数返回结果。选择20
的最大长度仅仅是因为输入[假设为] int
而正int
值最多包含10位数。
但是,varchar(20)
是否转换为SalePrice3
的类型是另一个问题,应该单独考虑。
答案 2 :(得分:0)
您必须创建一个实现所需结果的过程,而不是使用单个查询。