我已经创建了如下update语句
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
但是我想使用上面的语句更新更多的值,例如,如果想要更新price=123,它必须更新112233,如果price=456,它必须更新445566,如果price=725,它必须更新772255,如何实现这一点
发布于 2014-05-20 04:32:41
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
让我知道它是否有用。
发布于 2014-05-21 07:20:53
如果重点只是复制每个数字,这里是复制方法的另一个实现:
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
类型是另一回事,应该单独考虑。
发布于 2014-05-20 04:20:20
您必须创建一个过程来实现所需的结果,而不是使用单个查询。
https://stackoverflow.com/questions/23750852
复制相似问题