2013-07-29 55 views
0

我的一些疑問從MySQL轉移到PostgreSQL和我難倒如何重寫以下查詢PostgreSQL中的工作: SUM(phoneid IN (1, 2, 6, 8)) AS completedcallsMySQL到PostgreSQL查詢重寫使用「IN」?

我本來以爲我可以只是做SUM(SELECT phoneid FROM myTable WHERE phoneid = 1 OR phoneid = 2等等等等,但我不相信你可以在一個總和中有一個SELECT。

我也嘗試使用WITH查詢,但沒有運氣讓工作。

回答

4

如何使用CASE

SUM(CASE WHEN phoneid IN (1, 2, 6, 8) THEN 1 ELSE 0 END) 
4
count(phoneid in (1,2,6,8) or null) 
+2

我花了一段時間才能找出爲什麼這個工作,所以可能是值得的解釋: (1,2,6,8)中的phoneid計算爲一個布爾值;如果它是'true',則'或'快捷鍵,並給出'true';如果它是'false',則你有'false或null',其結果爲'null';最後'count()'只計算非空元素,即那些計算爲真的元素。我從來不知道你可以用'或'來做到這一點。 – IMSoP

+1

@IMSoP很好的解釋,但我不確定'true'時的'或'快捷方式,或者它評估所有表達式並應用[真值表](http://www.postgresql.org/docs/current/static /functions-logical.html) –

+0

這絕對是「最少鍵入」的解決方案。 – 2013-07-29 13:51:09

2

bool可轉換爲integer

SUM(CAST(phoneid IN (1, 2, 6, 8) AS INTEGER)) AS completedcalls 
+0

這是一個有用的技巧,因爲它可以用於未在'boolean'上定義的其他聚集,例如,如果至少有一行是「真」,則SELECT max(some_bool_column :: integer):: boolean'將給出'true',否則爲'false'。 – IMSoP

+2

@IMSoP您可以使用'bool_and()'和'bool_or()'來聚合布爾值。 –

+0

@IgorRomanchenko哦,我不知道!這更可讀。 :) – IMSoP