如何使用case语句更新值

时间:2014-05-20 04:07:35

标签: sql sql-server sql-server-2008 tsql case-when

我已经创建了如下所示的更新声明

    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如何才能实现此帮助我

3 个答案:

答案 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)

您必须创建一个实现所需结果的过程,而不是使用单个查询。

相关问题