【问题标题】:SQL LEFT JOIN return 0 rather than NULLSQL LEFT JOIN 返回 0 而不是 NULL
【发布时间】:2010-11-05 11:27:18
【问题描述】:

我想连接两个表,并计算每种类型的记录数。如果左表中没有该类型的记录,我希望返回 0,而不是 null。

我该怎么做?

【问题讨论】:

  • 什么类型的数据库? SQL Server、MySql、Oracle、...

标签: sql null left-join


【解决方案1】:

用途:

ISNULL(count(*), 0)

【讨论】:

  • 如果 count() 对没有记录返回 NULL,这将是有效的。但是 count() 返回 0。所以 count() 和 ISNULL(count(),0) 实际上是相同的。
【解决方案2】:

您可以使用“CASE”

SELECT T1.NAME, CASE WHEN T2.DATA IS NULL THEN 0 ELSE T2.DATA END
FROM T1 LEFT JOIN T2 ON T1.ID = T2.ID

【讨论】:

    【解决方案3】:

    我不确定我是否理解了你的确切问题,但是在左连接的 sqlserver 中, 如果您的查询是这样的,您将得到计数为 0:

    select t1.id, count(t2.id)
    from table1 t1
    left outer join table2 t2
    on t1.id = t2.id
    group by t1.id
    

    【讨论】:

    • 这很好。在我的回答中,我没有对这个计数是如何完成的做出任何假设。
    【解决方案4】:

    ISNULL(nullable, value_if_null) 用于 MsSQL,COALESCE(nullable1, nullable2, ..., value_if_null) 用于 MySQL。

    编辑: 有人告诉我,COALESCE 两者都适用,所以我会选择它来替换 NULL 列。

    现在我认为 COUNT()ing NULL 值在 MySQL 中也会返回 0,所以我同意 Rashmi。你能告诉我们查询和想要的结果吗?

    【讨论】:

      【解决方案5】:
      COALESCE(XXX, 0)
      

      例如

      SELECT branch1_id, branch1_name, COALESCE(devnum, 0) FROM
          branch1 as S LEFT JOIN view_inner_zj_devnum as B ON S.branch1_id = B.bid1 GROUP BY branch1_id;
      

      这对我有用。

      【讨论】:

        【解决方案6】:

        COALESCE 比 ISNULL 或 NVL 更具交叉兼容性(它适用于 MSSQL、Oracle、MySQL、Derby 等)。但我不确定性能差异。

        【讨论】:

        • 确实如此,但通常有更好的方法来抽象出数据库差异,而不是编写非特定于数据库的 SQL。
        【解决方案7】:

        查看 SQL Server 中的 IsNullSybase。在 Oracle 中使用 NVL

        【讨论】:

        • @Andomar。由于 Karl 没有描述他是如何进行计数(使用计数函数)甚至使用什么数据库,因此假设计数是正确答案是错误的。大概 Karl 没有像其他人在 SQL Server 中正确指出的那样使用计数,至少这将返回 0。
        • 例如,Karl 可以选择列 NumberOfItems。然而,如果 Karl 使用的是 Count,那么问题是不正确的。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-31
        相关资源
        最近更新 更多