当group by为null时,子查询选择

时间:2017-01-27 05:39:46

标签: sql postgresql group-by subquery

我有一个我无法弄清楚的问题。

SELECT (
  SELECT COUNT(bar.id)
  FROM bar
  WHERE foo.some_id = bar.some_id
  ) AS num_bar
  FROM foo
  GROUP BY some_id

如果foo看起来像这样:

ID|some_id
----------
1 |NULL
2 |apple
3 |orange

和bar看起来像这样

ID|some_id
----------
1 |NULL
2 |apple
3 |orange
4 |NULL
5 |apple
6 |orange

我希望它能够回归:

num_bar
-------
2
2
2

然后,NULL分组的计数每次都返回0。

当group by为NULL时,考虑此WHERE子句的正确方法是什么?

3 个答案:

答案 0 :(得分:1)

SQL聚合函数和比较可能会忽略计算中的NULL值

您可能想要做的是给它一个值,然后相应地解释空值。因此,在下面的查询中,您要求查询将空值解释为-1。

SELECT (
 SELECT COUNT(bar.id)
 FROM bar
 WHERE isnull(foo.some_id, -1) = isnull(bar.some_id,-1)
) AS num_bar
FROM foo
GROUP BY isnull(some_id,-1)

答案 1 :(得分:0)

如果我理解正确,您想要计算some_id表格中bar以及NULL's

不要在some_id聚合中使用count,例如count(some_id)。当some_id为NULL时,它将忽略NULL值并始终返回零。

试试这种方式

SELECT F.some_id,
       Count(1) AS count_someid
FROM   foo F
       INNER JOIN bar B
               ON F.some_id = B.some_id
                   OR ( F.some_id IS NULL AND B.some_id IS NULL ) -- To join NULL records
GROUP  BY F.some_id 
NULL's中的

some_id也会单独分组并计算

答案 2 :(得分:0)

使用与Nagendra Kakarla相同的逻辑更好的方式

SELECT  F.some_id ,COUNT(1) AS count_someid
FROM FOO F
INNER JOIN BAR B ON ISNULL(F.some_id,'#') = ISNULL(B.some_id,'#')
GROUP BY F.some_id

你会得到像

这样的结果
+---------+--------------+
| some_id | count_someid |
+---------+--------------+
| NULL    |            2 |
| apple   |            2 |
| orange  |            2 |
+---------+--------------+