【问题标题】:Update Field When Not Null不为空时更新字段
【发布时间】:2010-12-24 00:45:09
【问题描述】:

我有一个更新语句来更新字段 x、y 和 z 其中 id = xx。

在表中,我有几个不同的 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

我希望无需对数据库进行第二次事务就可以做到这一点。关于如何实现这一点的任何想法?

【问题讨论】:

    标签: mysql sql null sql-update


    【解决方案1】:

    这样做:

    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" 的任何内容。

    【讨论】:

    • 值得简要解释一下为什么会这样:coalesce 返回值列表中的第一个非空值,因此如果 scan_created_date 已经存在,它将自己设置为已经存在的值.如果为空,则将自己设置为当前时间戳。
    • 当 scan_created_date 为空时,这不会更新它吗?看起来他想在不为空的地方更新它。
    • @tloach - 查看解释。 @JacobM - 已经在做 :)
    • @ck:这看起来仍然与他所要求的相反。如果 scan_created_date 为 NULL,这将更新,他明确给出的查询仅在 scan_created_date 不为 NULL 时更新。
    • 换句话说,在他的例子中,一个空值将保持为空——它不会被设置。
    【解决方案2】:

    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
    

    【讨论】:

      【解决方案3】:

      我想你要找的是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
      

      【讨论】:

        【解决方案4】:

        您可以使用 COALESCE() 返回第一个非空值):

        scan_created_date = COALESCE(scan_created_date, "current_unix_timestamp")
        

        【讨论】:

          【解决方案5】:

          你可以这样做:

          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
          

          【讨论】:

            【解决方案6】:

            它相当于 Oracle 的 NVL。 您可以使用参数在准备好的语句中使用它,如下所示

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

            【讨论】:

              猜你喜欢
              • 2021-11-11
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2021-06-21
              • 2019-02-20
              • 1970-01-01
              • 2021-12-10
              相关资源
              最近更新 更多