1

有什么方法可以选择性地更新 SQL 语句中的多个字段中的任何一个?我只能做到以下几点:

UPDATE Customer SET 
    ContactName = ?  <=== what to do here if ? is null???
,   CompanyName = ?  <=== what to do here if ? is null???
,   AddressId   = ?  <=== what to do here if ? is null???
,   ...
WHERE CustomerId = ?

由于包装层和 MySQL 的限制,它必须是单个语句。

澄清一下,我想创建一个语句,该语句将使用列出的字段的一个或多个非空值运行,并且将仅更新值不为空的那些字段,而让其他字段不理会。

这是针对 RESTful 更新 API,我不想为每个可能的字段组合单独声明,并且我不想要求 API 调用者提供记录中的每个字段,这将是笨拙的并且不会面向未来(添加一个字段会中断现有的 API 调用)。因为它是一个 REST API,所以我希望映射POST /customer/xxx?ContactName=...&CompanyName=...以更新记录。

4

3 回答 3

1

您的目标并不完全清楚,但我认为您正在寻找合并功能;它将返回第一个非空值:

mysql> SELECT COALESCE(NULL,1); -> 1

mysql> 选择 COALESCE(NULL,NULL,NULL); -> 空

因此,您可以设置一个“默认”以在值为 null 的情况下使用:

UPDATE Customer SET 
    ContactName = COALESCE(?, <Some default>)
...

如果您不想更改字段,只需使用当前值:

UPDATE Customer SET 
    ContactName = COALESCE(?, ContactName)
于 2013-10-04T17:45:11.370 回答
0

通常,如果更新中的参数为 null,您会希望使用现有值:

UPDATE Customer SET 
    ContactName = COALESCE(?,ContactName)
于 2013-10-04T17:49:58.270 回答
0
UPDATE Customer SET 
    ContactName = ifnull(?,ContactName)
,   CompanyName = ifnull(?,CompanyName)
,   AddressId   = ifnull(?,AddressId)
WHERE CustomerId = ?

SQL小提琴

于 2013-10-04T17:53:16.737 回答