是否可以在MySQL更新语句中有条件地仅设置一些值?

时间:2013-01-01 23:50:07

标签: mysql

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

我的愿望是做一些看起来像伪代码的东西:

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

3 个答案:

答案 0 :(得分:2)

执行此操作的一种方法是使用COALESCE()将每个列“默认”为其原始值。

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

COALESCE()返回其第一个非null参数,因此如果a为null,它将只返回原始值name,因此不会有净更改。

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

答案 1 :(得分:2)

您可以使用COALESCE之类的:

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

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

答案 2 :(得分: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)