0

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

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

基本上,我想显示该统计信息的次数 < 10,如果计数为 0,则返回 0 而不是 null。如果计数 >0,我将得到我想要的数字作为结果,但是如果计数为 0我仍然得到一个 null 返回。(如果我将第二个参数设置为合并为正数,也是一样的)。我究竟做错了什么?

4

1 回答 1

3

我按照我认为您想要的方式重写了您的查询:

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

count()0当没有找到匹配的行(或列中的非空值)时返回。不需要coalesce()。我在此引用手册

需要注意的是,除了 count 之外,这些函数在没有选择行时返回空值。

强调我的。如果您想在返回时返回不同的值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 BYand中可见,而GROUP BY不是WHEREor HAVING

于 2012-07-11T17:26:28.053 回答