更新非空字段

18

我有一个更新语句,它会更新id = xx的x、y和z字段。

在表中,我有几个不同的x_created_datetime字段(针对由不同人维护/输入的记录的不同部分)。如果该字段为空,我想编写一个单一的查询来更新它,但是如果该字段不为空,则不做更改。

所以我现在拥有:

UPDATE newspapers
SET scan_notes = "data",
    scan_entered_by = "some_name",
    scan_modified_date = "current_unix_timestamp"
WHERE id = X

我需要的是一种方法来添加以下内容,但仍然始终更新以上内容:

scan_created_date = "current_unix_timestamp"
where scan_created_date is null

我希望能够在不进行第二个数据库事务的情况下完成这个任务。有什么好的想法吗?

6个回答

43

执行以下操作:

UPDATE newspapers
SET scan_notes = "data",    
  scan_entered_by = "some_name",    
  scan_modified_date = "current_unix_timestamp",
  scan_created_date = COALESCE(scan_created_date, "current_unix_timestamp")
WHERE id = X

COALESCE函数选择第一个非空值。在这种情况下,如果存在,它将更新日期戳scan_created_date为相同的值,否则它将使用你替换"current_unix_timestamp"的任何值。


3
值得简要解释一下为什么这个方法有效:coalesce返回您值列表中第一个非null值,因此如果scan_created_date已经存在,则它将设置为已经存在的值。 如果它为空,它将设置为当前时间戳。 - Jacob Mattison
这不会更新扫描创建日期(scan_created_date),当它为空时吗?看起来他想在其不为空时更新它。 - tloach
@tloach - 看看解释。@JacobM - 已经在做了 :) - cjk
1
@ck:这仍然看起来与他要求的相反。这将在scan_created_date为NULL时进行更新,他明确给出的查询仅在scan_created_date不为NULL时进行更新。 - tloach
换句话说,在他的例子中,空值将保持为空 - 不会被设置。 - tloach
显示剩余2条评论

7

MySQL拥有一个IFNULL函数,因此您可以这样做:

UPDATE newspapers
SET scan_notes = "data",
    scan_entered_by = "some_name",
    scan_modified_date = "current_unix_timestamp"
    scan_created_date = IFNULL( scan_created_date, "current_unix_timestamp" )
WHERE id = X

6
我认为您正在寻找的是IF()函数。该函数的文档可以在这里找到。
UPDATE newspapers
SET scan_notes = "data",
    scan_entered_by = "some_name",
    scan_modified_date = "current_unix_timestamp",
    scan_created_date = IF(scan_created_date IS NOT NULL, "current_unix_timestamp", NULL)
WHERE id = X

3
您可以使用COALESCE()函数(返回第一个非空值):
scan_created_date = COALESCE(scan_created_date, "current_unix_timestamp")

2
你可以像这样做:

你可以像这样做:

UPDATE newspapers a, newspapers b
SET a.scan_notes = "data",    
  a.scan_entered_by = "some_name",    
  a.scan_modified_date = "current_unix_timestamp",
  b.scan_created_date = "current_unix_timestamp"
WHERE a.id = X AND b.id = X AND b.scan_created_date is not NULL

1

它类似于Oracle的NVL函数。您可以在使用参数的准备语句中按如下方式使用它。

UPDATE
    tbl_cccustomerinfo
SET
    customerAddress = COALESCE(?,customerAddress),
    customerName =  COALESCE(?,customerName),
    description =  COALESCE(?,description)
WHERE
    contactNumber=?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接