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''
而(@StepCreate 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;