为什么 COALESCE 函数对此查询不起作用?

Mat*_*thu 3 postgresql join subquery coalesce

我正在尝试计算从子查询中检索的列数,并且某些子查询可能为空。因此,我不想将其显示为空单元格,而是希望它为 0。发现我可以通过使用该COALESCE函数来做到这一点,但例如此查询仍然给我一个空单元格:

CREATE VIEW third_table AS 
SELECT * 
FROM  (second_table  
NATURAL FULL JOIN (
   SELECT assignment_id, COALESCE( count(*), 0 ) AS num_60_79 
   FROM (
      SELECT assignment_id, mark_as_percent 
      FROM avg_required_table
      WHERE mark_as_percent >= 60 
      AND mark_as_percent < 80
      ) a 
   GROUP BY assignment_id
   ) b);
Run Code Online (Sandbox Code Playgroud)

这是COALESCE应该如何使用?

Erw*_*ter 5

回答问题

COALESCE你把它放在哪里是完全没有意义的。聚合函数count()永远不会返回NULL。逻辑规定num_60_79子查询中的值永远不能低于 1。有关的:

但这无关紧要。返回行的子查询根本无法返回任何值。

准确地说,在您的情况下,子查询可能会返回任意数量的行,但是,当加入 时second_table,如果没有行匹配,(assignment_id, num_60_79)则子查询中的所有列都b将填充NULL值。看:

NATURAL FULL JOIN是一种非常奇特的连接表的方式。特别是对于仍在学习如何使用的人来说COALESCE手册:

NATURAL是一个列表的简写USING,其中提到了两个表中具有相同名称的所有列。

和:

FULL OUTER JOIN返回所有连接的行,加上每个不匹配的左侧行(在右侧用空值扩展)的一行,以及每个不匹配的右侧行(在左侧用空值扩展)的一行。

我认为可以安全地假设num_60_79in 中没有命名的列second_table,并且如果有的话,您肯定不会希望将其包含在连接条件中。您只想加入 列assignment_id,这就是您应该在查询中放入的内容而不是关键字NATURAL

另外,虽然FULL JOIN理论上这是可能的,但我们通常会看到LEFT JOIN.

您也不需要查询中的两层子查询和其他一些噪音。

正确查询

考虑到所有事情,当你...

尝试计算从子查询中检索的列数

...我有根据的猜测是您想要这个查询:

SELECT s.*, COALESCE(b.num_60_79, 0) AS num_60_79
FROM   second_table s
LEFT   JOIN (
   SELECT assignment_id, count(*) AS num_60_79 
   FROM   avg_required_table
   WHERE  mark_as_percent >= 60 
   AND    mark_as_percent <  80
   GROUP  BY assignment_id
   ) b USING (assignment_id);
Run Code Online (Sandbox Code Playgroud)