2013-07-29 54 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