1

我有一种情况,用户可能会或可能不会提供需要进入包含该用户信息的行的各种数据位。问题是随着时间的推移,他们需要在行中输入多个条目,并且我不想取消任何预先存在的值,如果这些值是在过去设置的。

我的愿望是做一些看起来像这样的事情(在伪代码中):

var a,b,c;// 这些是用户提供的值,任何时候都可能为空

update user if a != null set name = a,  if b != null set phone = b, if c != null set email c

我一直在尝试使 IF 以这种方式工作,但我尝试过的各种方式都出现语法错误。希望有人可以阐明执行此操作的正确方法(如果可能的话)。

TIA

4

3 回答 3

2

一种方法是使用COALESCE()将每列“默认”为其原始值。

UPDATE user
SET name = COALESCE(a, name),
    phone = COALESCE(b, phone),
    email = COALESCE(c, email)
WHERE ...

COALESCE() 返回它的第一个非空参数,所以如果a为空,它只会返回 的原始值name,所以不会有净变化。

MySQL 还支持 ISNULL() 函数,其工作方式类似于 COALESCE(),但 COALESCE() 是标准 SQL。此外, COALESCE() 支持两个以上的参数。

于 2013-01-01T23:54:34.367 回答
2

你可以COALESCE像这样使用:

UPDATE user SET name = coalesce(a, name), ...

可能更好的方法是动态创建您的 UPDATE 语句并仅包含需要更新的字段。

于 2013-01-01T23:55:14.287 回答
1

以下是纯粹在 SQL 中执行此操作的方法:

UPDATE user
SET name = IF(a IS NULL, name, a),
    phone = IF(b IS NULL, phone, b),
    email = IF(c IS NULL, email, c)
于 2013-01-01T23:54:18.880 回答