2012-07-11 64 views
0

我试图运行下面的查询:合并不评估第二个参数?

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

基本上,我想说明的时候,这是统计10 <的数量,并返回0,而不是空如果计数为0如果计数> 0我得到我想要的数字作为结果,但是如果计数为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语句。

另外,在WHERE percent_cov < 10中写入count(percent_cov)是没有用的。在这种情况下,只有非空值符合条件,count(*)会产生相同的结果,速度更快,更简单。

您不需要GROUP BY条款,因为您不会按任何条件进行分组,您正在聚合整个表格。
可以GROUP BY target,但这将是不同的查询

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

您将需要再次拼出HAVING子句中的表达。输出列名仅在ORDER BYGROUP BY,而不是WHEREHAVING中可见。

+0

这是行不通的,谢谢!我想我会让事情比他们需要的更努力。 – user1453804 2012-07-11 18:12:12

+0

@ user1453804:是的,我想。 :)但是,一旦你知道如何,编程中的大多数事情似乎很容易。 – 2012-07-11 18:14:44