Sql 如何使用case语句更新值

Sql 如何使用case语句更新值,sql,sql-server,sql-server-2008,tsql,case-when,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 P

我创建了如下更新语句

    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
更新dbo.S\u项

SET saleprice 3=CASE WHEN Price您必须创建一个用于获得所需结果的过程,而不是使用单个查询。

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

创建函数复制数字(
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
@数字(整数) 返回BigInt 开始 声明@Step SmallInt=1, @结果nVaRchar(100)=N'' 而(@Step
Create Function ReplicateDigits(
@数字(整数)
返回BigInt
开始
声明@Step SmallInt=1,
@结果nVaRchar(100)=N''

而(@Step如果该点只是每个数字的复制,那么这里是复制方法的另一个实现:

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;
该方法包括向后迭代数字,使用
子字符串
提取每个数字,然后使用
STUFF
复制这些数字

您将使用与中相同的函数:

更新dbo.S\u项
设置SalePrice3=案例
当价格<0时,则为“-1”
ELSE dbo.DuplicateDigits(售价3)
结束;
稍微解释一下为什么函数的返回类型是
varchar
,这是因为无论输入的[合理]长度是多少,函数都会返回结果。选择
20
的最大长度仅仅是因为输入[假定为]
int
和正
int
值最多由10位数字组成


但是,是否将
varchar(20)
转换为
SalePrice3
类型是另一个问题,应该单独考虑。

如果该点只是每个数字的重复,下面是复制方法的另一个实现:

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;
该方法包括向后迭代数字,使用
子字符串
提取每个数字,然后使用
STUFF
复制这些数字

您将使用与中相同的函数:

更新dbo.S\u项
设置SalePrice3=案例
当价格<0时,则为“-1”
ELSE dbo.DuplicateDigits(售价3)
结束;
稍微解释一下为什么函数的返回类型是
varchar
,这是因为无论输入的[合理]长度是多少,函数都会返回结果。选择
20
的最大长度仅仅是因为输入[假定为]
int
和正
int
值最多由10位数字组成


但是,是否
varchar(20)
转换为
SalePrice3
类型是另一个问题,应该单独考虑。

确切的问题是什么?严格地说,当语句解决问题时,再添加3条语句,不是吗?如果是3条语句,我可以添加,但如果更多,例如价格值,任何介于10到1000之间的东西,我应该写1000条吗语句?您希望所有输入值或范围都有单独的映射吗?或者…?确切的问题是什么?严格地说,如果语句可以解决您的问题,则再添加3条语句,否?如果是3条语句,我可以添加,但如果是更多,例如价格值,我应该编写1000条语句吗?您希望单独添加吗所有输入值或范围的e映射或…?我是sql server的新手,您能告诉我吗help@user3078299请看我的答案。我是sql server的新手,你能告诉我吗help@user3078299所以请看我的答案。非常感谢您的快速响应,现在在我的系统中一切正常,我将检查服务器并通知您you@user3078299不客气。你能正式接受a吗请回答?非常感谢您的快速回复,现在在我的系统中一切正常,我将签入服务器并通知您you@user3078299不客气。你能正式接受答案吗?谢谢你的解决方案这非常有用谢谢你的解决方案这非常有用
UPDATE  dbo.S_Item
SET     SalePrice3 = CASE
                         WHEN Price < 0 THEN '-1'
                         ELSE dbo.DuplicateDigits(SalePrice3)
                     END;