如果NOT NULL,则UPDATE,否则保留字段的值


10

我认为以某种方式可以使它正常工作,但是由于某些原因,我仍然会出错。

我有以下UPDATE查询:

UPDATE DeviceAttribute
SET Details = CASE Name
          WHEN 'Accessories' THEN @Accessories
          WHEN 'Description' THEN @Description
          WHEN 'Specification' THEN @Specification
          ELSE Details
END
WHERE DeviceID = 10

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

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

数据库存储在SQL Server 2008中

先谢谢您的帮助。

编辑以澄清:

原始表格如下所示

DeviceID|Name         |Details   |
     10 |Accessories  |earplugs  |
     10 |Description  |protectors|
     10 |Specification|BeatsByDre|

出于发布原因,我进行了查询以打开表格。因此,当执行Select查询时,返回表如下所示

DeviceID|Accessories|Description|Specification|
     10 |earplugs   |protectors |BeatsByDre   |

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


您能提供这个确切的错误吗?是SQL Server错误还是您的(UI)应用程序中的错误?UPDATEUI向数据库发送什么语句?
ypercubeᵀᴹ

您可以在问题中添加吗?该语句的构造方式和使用的引号可能与它有关。这 '@'Accessories对我来说没有意义。
ypercubeᵀᴹ

1
我认为您的UI代码可能未生成有效的语句。向我们显示您拥有的代码并产生错误,而不是伪代码。
ypercubeᵀᴹ

我要再次感谢您的帮助。对不起,我没有经验。我设法找到了错误,而您说对了,问题出在UI级别。非常感谢你的帮助。如果有人正在寻找类似的答案,我会使用第一个解决方案
Greenhorn

Answers:


13

我认为这将解决问题:

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 ;

或这样做(以避免重复更新):

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
      ) ;

或者使用表值构造函数:

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 ;

感谢你及时的答复。我会尝试一下,让您知道结果。
格林霍恩

您的意思是我的答案中的第二个解决方案?
ypercubeᵀᴹ

是的,我正在尝试第三种解决方案,我赞成答案,因为它提供了很多可能性。我将第3个输入,如果我可以使用它,我也会接受。
格林霍恩2013年

所有人都应该工作。如果没有,则可以编辑问题并添加表结构(“创建表”语句)和“存储过程”。我可能会误解一些相关的内容,或者您​​没有提及。
ypercubeᵀᴹ

如果所有参数都不为空,则这些答案有效,但当其中一个参数为空时,这些答案无效,然后查看UI代码及其在生成查询时如何处理空值。您可以在问题中添加该(UI)代码。
ypercubeᵀᴹ
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.