SQL Server 如何使用不同的值更新同一列

beq87vna  于 2022-11-21  发布在  其他
关注(0)|答案(3)|浏览(167)
create table Attributes
(
    id int, 
    AttributeName nvarchar(255), 
    AttributeValue nvarchar(255)
)

insert into Attributes
values
 (1, 'BuiltNo', '001')
,(1, 'ManagerName', 'x')
,(1, 'PlantAddress', 'NY')
,(2, 'BuiltNo', '002')
,(2, 'ManagerName', 'y')
,(2, 'PlantAddress', 'NSW')
,(3, 'BuiltNo', '003')
,(3, 'ManagerName', 'z')
,(3, 'PlantAddress', 'QLD')

我想在一个更新查询中更新BuiltNoManagerNamePlantAddress,其中id = 1。显然,我们不能在同一个查询中有2个where条件,因此需要寻找不同的解决方案。

update Attributes 
set AttributeValue = '*001'  where AttributeName = 'BuiltNo' ,
set  AttributeValue = '*UpdatedValue'   where AttributeName = 'ManagerName' 
where id = 1
gab6jxml

gab6jxml1#

您可以在values子句上使用join来指定要套用的条件和新值,如下所示:

update Attributes
set AttributeValue = NewAttributeValue
from dbo.Attributes
join (values
  (1, 'BuiltNo', '*001'),
  (1, 'ManagerName', '*UpdatedValue')
) modifications (id, AttributeName, NewAttributeValue)
  on Attributes.id=modifications.id and Attributes.AttributeName=modifications.AttributeName;

其结果为:
| 标识符|属性名称|属性值|
| - -|- -|- -|
| 一个|构建编号| *001号|
| 一个|经理Name| * 更新值|
| 一个|工厂地址|纽约州|
| 2个|构建编号|002年|
| 2个|经理Name| Y形|
| 2个|工厂地址|新南威尔士|
| 三个|构建编号|003年|
| 三个|经理Name| Z轴|
| 三个|工厂地址|昆士兰州|

9lowa7mx

9lowa7mx2#

只是一个想法,传递JSON字符串

示例

Declare @I int = 1
Declare @J varchar(max) = '{"BuiltNo":"*001","ManagerName":"*UpdatedValue" }'

Update A
   set AttributeValue =B.Value
 From  Attributes A
 Join ( Select * from openjson(@J) ) B
 On A.id=@I and A.AttributeName=B.[key] collate SQL_Latin1_General_CP1_CI_AS

更新的表格

nr9pn0ug

nr9pn0ug3#

使用case when可以获得一个简单方法。

UPDATE Attributes 
    SET AttributeValue =  CASE  
                        WHEN AttributeName = 'BuiltNo' THEN '*001'
                        WHEN AttributeName = 'UpdatedValue' THEN 'ManagerName'  
                        
                    END 
    WHERE id = 1 and AttributeName IN ('BuiltNo', 'UpdatedValue')

相关问题