SQL左连接返回0而不是NULL

46
我想要将两个表联接起来,并计算每个类型的记录数。如果左表中没有该类型的记录,我希望返回 0,而不是 null。
如何实现?

1
什么类型的数据库?SQL Server,MySql,Oracle... - Patrick McDonald
7个回答

29

使用:

ISNULL(count(*), 0)

10
如果count()不返回任何记录时返回NULL,那么这个说法是正确的。然而,count()会返回0。因此,count()和ISNULL(count(),0)实际上是相同的意思。 - Rashmi Pandit

26

你可以使用 "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

干得好,兄弟。我使用了sum()函数,它起作用了。 - Hossein Badrnezhad

16
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;

那对我来说没问题。


13

对于MsSQL,使用ISNULL(可空对象,如果为空则返回的值),对于MySQL,使用COALESCE(可空对象1,可空对象2,...,如果为空则返回的值)

编辑: 据我所知,COALESCE在两者中都适用,因此我会选择它来替换NULL列。

现在我认为,在MySQL中,COUNT()NULL值也返回0,所以我同意Rashmi的观点。您能展示一下查询和期望的结果吗?


12

我不确定我是否完全理解了你的问题,但在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

这是一个很好的观点。在我的回答中,我没有做出任何关于如何进行计数的假设。 - RichardOD

7

COALESCE比ISNULL或NVL更具跨兼容性(它可以在MSSQL、Oracle、MySQL、Derby等平台上使用)。但我不确定它们之间的性能差异。


这是真的,但通常有更好的方式来抽象出数据库差异,而不是编写非特定于数据库的SQL。 - RichardOD

4

在SQL Server和Sybase中查看IsNull。在Oracle中使用NVL


@Andomar。由于Karl没有描述他如何计算数量(使用计数函数)或者使用了哪种数据库,因此假设count是正确答案是错误的。可以推断出,至少在SQL Server中,Karl没有使用count函数,正如其他人正确指出的那样,这将返回0。 - RichardOD
例如,卡尔可能正在选择一个名为NumberOfItems的列。但是,如果卡尔使用Count函数,那么这个问题就是不正确的。 - RichardOD

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