SQL 查询更新输入参数不为 Null 的表列?

Posted

技术标签:

【中文标题】SQL 查询更新输入参数不为 Null 的表列?【英文标题】:SQL query to update table columns where input parameters are not Null? 【发布时间】:2012-03-22 11:42:51 【问题描述】:

我有一个包含以下列的表格。

Ticket_id (Primary key, Int)
Attachment1 (varchar)
Attachment2 (varchar)
Attachment3 (varchar)
Attachment4 (varchar)
Attachment5 (varchar)

我正在编写一个存储过程来更新这个表。以上6列有6个输入参数。

@Attached_File1 VARCHAR(MAX),
@Attached_File2 VARCHAR(MAX),
@Attached_File3 VARCHAR(MAX),
@Attached_File4 VARCHAR(MAX),
@Attached_File5 VARCHAR(MAX),
@Ticket_ID BIGINT

我想编写一个 sql 查询,它将使用输入参数中指定的值更新表。但我不能用 null 覆盖附件列。我的意思是我只需要使用那些包含数据的参数。

比如表有一行[10, "aaa", "bbb", null, null, null],输入参数为(10, null, null, "ccc", "ddd", null ) 那么在更新后该行将变为 [10, "aaa", "bbb", "ccc", "ddd", null]

如何检查空/空字符串并相应地生成更新查询以实现此目的?

【问题讨论】:

如果这是 SQL Server,则“plsql”标签不正确。 您是否必须关注已经为非空的列的非空输入参数?如果有,有什么补救措施? 【参考方案1】:

你可以使用 ISNULL

UPDATE table_name SET
  Attachment1 = ISNULL(Attachment1, @Attached_File1),
  Attachment2 = ISNULL(Attachment2, @Attached_File2),
  Attachment3 = ISNULL(Attachment3, @Attached_File3),
  Attachment4 = ISNULL(Attachment4, @Attached_File4),
  Attachment5 = ISNULL(Attachment5, @Attached_File5)
WHERE Ticket_id = @Ticket_ID

此解决方案不会用新值覆盖现有值。如果你想这样做,你应该切换值:

ISNULL(@Attached_File1, Attachment1)

【讨论】:

【参考方案2】:

你可以试试这个:

update MY_TABLE set Attached_File1 = ISNULL(@parameter1, Attached_File1);

【讨论】:

sql-server 参数不使用@ 而不是:【参考方案3】:

你可以简单地;

SET 
   AttachmentX = ISNULL(AttachmentX, @Attached_FileX)

或者如果参数可以是空字符串

   AttachmentX = ISNULL(AttachmentX, NULLIF(@Attached_FileX, ''))

【讨论】:

这不是错误的方式吗? OP 希望防止写入 NULL 参数...【参考方案4】:

在您的UPDATE 语句中,您可以使用COALESCE 语句,例如:

SET Attachment1 = COALESCE(@Attached_File1, Attachment1)

如果@Attached_File1NULL,那么Attachment1 的当前值将实际上保持不变。

【讨论】:

我支持这个答案,没有理由这不起作用 - 请重新检查您的代码并注意与 ISNULL 不同,参数的顺序相反 COALESCE(@Attached_File1, Attachment1) 而不是 COALESCE(Attachment1, @Attached_File1)所以你不能只用COALESCE查找/替换ISNULL

以上是关于SQL 查询更新输入参数不为 Null 的表列?的主要内容,如果未能解决你的问题,请参考以下文章

如何进行内部联接查询以获取多个选定的表列

T-SQL 使用函数更新表列

更新 SQL Server 2005 中的表列

SQL Server 表列的条件更新

在 SQL Server 中,如何从子查询中标识的表列名称中检索数据值?

如何在 sql server 2008 中获取没有约束的表列?