2012-07-11 107 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