【问题标题】:Can't update from NULL to 0无法从 NULL 更新为 0
【发布时间】:2014-08-17 08:20:40
【问题描述】:

您好,我正在使用此命令将一个表与另一个具有更多记录但仍打印 NULL 的表进行左连接。我希望那个 NULL 变成 0。

SELECT * FROM TABLE1

Left JOIN Table2 ON TABLE1.ID=Table2.IDRel

UPDATE Table2 SET IDRel = 0 where IDRel = NULL

【问题讨论】:

  • 使用IS NULL,没有任何东西等于或不等于NULL
  • 正如@xQbert 回答的那样,问题可能是您在Table1 中有行而在Table2 中没有匹配的行,因此更新没有意义 - 您可能只想使用他的解决方案将 LEFT JOIN 输出中的空值合并为 0。

标签: sql sql-server database sql-server-2008 dbo


【解决方案1】:

应该不需要更新。 正如您所说,Table2 has a little more records 是这里的关键,这意味着对于 Table1 中找不到匹配 IDRel 值的任何行,该列 (IDRel) 将保留 NULL

现在您可以例如使用ISNULL(IDRel, 0) 将空值替换为0,但也许INNER JOIN 而不是LEFT JOIN 可以获得正确的结果,从而丢弃所有无法匹配的行...

但是...如果您真的要更新该列,它只有在您与NULL(即IS而不是=)进行正确比较时才有效,这意味着将您的更新查询更改为:

UPDATE Table2 SET IDRel = 0 where IDRel IS NULL

【讨论】:

  • 我认为问题在于 LEFT JOIN 创建 NULL,而不是 table2 包含 NULL
  • @adrianm 你是对的,左连接创建空值,我希望它们为 0 或其他任何值,但不是空值
  • 对,对不起,您的问题浏览得太快了,我更新了我的答案以考虑这两种可能性。
【解决方案2】:

使用这个查询

 UPDATE Table2 SET IDRel = 0 where IDRel is NULL

【讨论】:

    【解决方案3】:

    使用IS NUll

    SELECT * FROM TABLE1
    
    Left JOIN Table2 ON TABLE1.ID=Table2.IDRel
    
    UPDATE Table2 SET IDRel = 0 where IDRel IS  NULL
    

    【讨论】:

      【解决方案4】:

      甚至需要更新吗?

      SELECT T1.*, coalesce(t2.IDREL,0) as IDREL 
      FROM TABLE1 T1
      Left JOIN Table2 ON TABLE1.ID=Table2.IDRel
      

      【讨论】:

        猜你喜欢
        • 2012-07-16
        • 2020-04-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-01
        相关资源
        最近更新 更多