SQL LEFT JOIN возвращает 0, а не NULL - PullRequest
23 голосов
/ 24 июня 2009

Я хочу объединить две таблицы с подсчетом количества записей для каждого типа. Если в левой таблице нет записей такого типа, я хочу вернуть 0, а не ноль.

Как я могу это сделать?

Ответы [ 7 ]

15 голосов
/ 24 июня 2009

Использование:

ISNULL(count(*), 0)
11 голосов
/ 24 июня 2009

Я не уверен, что понял вашу проблему, но в 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
11 голосов
/ 24 июня 2009

ISNULL(nullable, value_if_null) для MsSQL, COALESCE(nullable1, nullable2, ..., value_if_null) для MySQL.

Edit: Как мне сказали, COALESCE работает для обоих, поэтому я бы выбрал это вместо NULL столбцов.

Теперь я думаю, что COUNT() ing NULL values ​​возвращает 0 и в MySQL, поэтому я согласен с Рашми. Не могли бы вы показать нам запрос и желаемый результат?

10 голосов
/ 20 ноября 2012

Вы можете использовать «СЛУЧАЙ»

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
4 голосов
/ 24 июня 2009

Посмотрите на IsNull в SQL Server и Sybase . Используйте NVL в Oracle.

3 голосов
/ 24 июня 2009

COALESCE является более кросс-совместимым, чем ISNULL или NVL (он работает на MSSQL, Oracle, MySQL, Derby и др.). Но я не уверен насчет различий в производительности.

0 голосов
/ 20 марта 2019
COALESCE(XXX, 0)

* 1002 Е.Г. *

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;

Это работает для меня.

...