IF NOT NULL 然后 UPDATE 否则保留该字段的值

Gre*_*orn 10 sql-server-2005 sql-server-2008 sql-server

我想我在某种程度上接近让它工作,但由于某种原因我仍然会出错。

我有以下更新查询:

UPDATE DeviceAttribute
SET Details = CASE Name
          WHEN 'Accessories' THEN @Accessories
          WHEN 'Description' THEN @Description
          WHEN 'Specification' THEN @Specification
          ELSE Details
END
WHERE DeviceID = 10
Run Code Online (Sandbox Code Playgroud)

参数由不同的用户填写。我现在面临的问题是,即使您想更新单个字段,您仍然必须使用旧数据填写其他参数。因此,我想设置选项 IF @parameter IS NULL THEN THEN 保留已存储在数据库中的值。我试图找到一些解决方案,类似以下查询的内容似乎是解决方案,但我无法让它工作:

UPDATE DeviceAttribute
SET Details = CASE Name
          WHEN 'Accessories' IS NOT NULL THEN @Accessories
          WHEN 'Description' IS NOT NULL THEN @Description
          WHEN 'Specification' IS NOT NULL THEN @Specification
          ELSE Details
END
WHERE DeviceID = 10
Run Code Online (Sandbox Code Playgroud)

数据库存储在 SQL Server 2008 中

在此先感谢您的帮助。

编辑以澄清:

原来的表是这样的

DeviceID|Name         |Details   |
     10 |Accessories  |earplugs  |
     10 |Description  |protectors|
     10 |Specification|BeatsByDre|
Run Code Online (Sandbox Code Playgroud)

出于出版原因,我进行了查询以扭转局面。因此,当运行 Select 查询时,返回表如下所示

DeviceID|Accessories|Description|Specification|
     10 |earplugs   |protectors |BeatsByDre   |
Run Code Online (Sandbox Code Playgroud)

我创建了一个 UI 来让系统用户更新不同的字段,如附件、描述、规格。如果我使用顶部显示的查询更新所有字段,则更新有效。但是,当我将文本框留空时,我会收到一个错误,指出 @parameter 缺少值。因此,试图找到一种解决方案来仅更新写入内容的字段。因此,如果@parameter IS NULL 则保留数据库中的原始值。我找到了另一个解决方案,它非常接近我想要的但无法让它工作。这是另一个解决方案:https : //stackoverflow.com/questions/9387839/mysql-if-not-null-then-display-1-else-display-0

ype*_*eᵀᴹ 14

我认为这将解决问题:

UPDATE DeviceAttribute
SET Details = CASE Name
          WHEN 'Accessories'   THEN COALESCE(@Accessories, Details)
          WHEN 'Description'   THEN COALESCE(@Description, Details)
          WHEN 'Specification' THEN COALESCE(@Specification, Details)
          ELSE Details
              END
WHERE DeviceID = 10 ;
Run Code Online (Sandbox Code Playgroud)

或者这个(为了避免冗余更新):

UPDATE DeviceAttribute
SET Details = CASE Name
          WHEN 'Accessories'   THEN @Accessories
          WHEN 'Description'   THEN @Description
          WHEN 'Specification' THEN @Specification
          ELSE Details
              END
WHERE DeviceID = 10 
  AND ( Name = 'Accessories'   AND @Accessories IS NOT NULL
     OR Name = 'Description'   AND @Description IS NOT NULL
     OR Name = 'Specification' AND @Specification IS NOT NULL
      ) ;
Run Code Online (Sandbox Code Playgroud)

或者,使用表值构造函数:

UPDATE da
SET da.Details = upd.Details
FROM DeviceAttribute AS da
  JOIN
    ( VALUES
      ('Accessories'   , @Accessories),
      ('Description'   , @Description),
      ('Specification' , @Specification)
    ) AS upd (Name, Details)
    ON upd.Name = da.Name 
WHERE da.DeviceID = 10
  AND upd.Details IS NOT NULL ;
Run Code Online (Sandbox Code Playgroud)