【问题标题】:How to update values using case statement如何使用 case 语句更新值
【发布时间】:2014-05-20 04:07:34
【问题描述】:

我创建了如下更新语句

    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 个 when 语句可以解决您的问题,不是吗?
  • 如果是 3 条语句,我可以添加,但如果它更多,例如价格值在 10 到 1000 之间的任何东西,我应该写千条语句吗?
  • 您想要所有输入值或范围的单独映射还是...?

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


【解决方案1】:
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

如果有用请告诉我。

【讨论】:

  • 非常感谢您的快速回复,现在在我的系统中很好,我会检查服务器并通知您
  • @user3078299 不客气。请问您能正式接受答案吗?
【解决方案2】:

如果点只是在每个数字的重复中,这里是重复方法的另一种实现:

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的类型是另外一回事,应该单独考虑。

【讨论】:

  • 感谢您的解决方案,这非常有用
【解决方案3】:

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

【讨论】:

  • 我是 sql server 新手,您能帮忙吗
  • @user3078299 所以看看我的回答。
猜你喜欢
  • 2017-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-06
  • 1970-01-01
  • 2023-03-08
相关资源
最近更新 更多