合并不评估第二个参数?

时间:2012-07-11 17:15:25

标签: sql postgresql count aggregate-functions

我正在尝试运行以下查询:

SELECT COALESCE(count(percent_cov), 0)
FROM sample_cov
WHERE target = 542
GROUP BY percent_cov
HAVING percent_cov < 10

基本上,我想显示这个统计数据的次数&lt;如果计数为0,则返回0而不是null。如果计数> 0,则得到我想要的数字作为结果,但是如果计数为0,我仍然得到返回的null。 (如果我将第二个参数设置为合并为正数,则相同)。我做错了什么?

1 个答案:

答案 0 :(得分:3)

我按照你想要的方式重写了你的查询:

SELECT count(*) AS ct
FROM   sample_cov
WHERE  target = 542
AND    percent_cov < 10;

count()返回0当找不到匹配的行(或列中的非空值)时。无需coalesce()。我引用the manual on this

  

应该注意除了计数,这些函数返回一个   没有选择行时为空值。

强调我的。如果您想count()使用0返回时返回其他值,请使用CASE语句。

此外,当您count(percent_cov)时,WHERE percent_cov < 10无效。只有非空值才有资格,count(*)在这种情况下产生的结果会更快更简单。

您不需要GROUP BY条款,因为您没有按任何方式进行分组,而是整合了整个表格。
 您可以 GROUP BY target,但这将是不同的查询

SELECT target, count(*)
FROM   sample_cov
GROUP  BY target
WHERE  percent_cov < 10;

您需要再次在HAVING子句中拼出表达式。输出列名称仅在ORDER BYGROUP BY中显示,而不是WHEREHAVING