我有一个资源预订的数据库(在postgres 9.3上运行)。此数据库包含一个表预订,其中包含其他值,预留的开始和停止时间(timestamp with time zone
)
现在我需要知道一家公司目前在所有这些预订的总小时数中加入了多少预订。
我已经整理了以下查询来完成这项工作:
SELECT EXTRACT(EPOCH FROM Sum(stop-start))/3600 AS total
FROM (reservations JOIN partners ON partner = email)
WHERE stop > now() AND company = 'givencompany'
这很有效如果给定的公司将来有保留。我遇到的问题是,当公司没有任何保留时,查询确实会返回一行但是collumn total
是空的,而我希望它根本不返回任何行(或者包含{{的行)在这种情况下,如果没有什么太复杂的话,那么就没有了。
这可以通过对数据库进行不同的0
或其他修改来实现,还是消费应用程序每次都必须检查SELECT
?
很抱歉,如果我的问题很简单,但我完全不熟悉数据库
修改
我发现我可以使用null
使用0
默认返回的值,但如果不返回任何行,我会更喜欢它
答案 0 :(得分:1)
简短回答:只需在查询结束时添加HAVING Sum(stop-start) IS NOT NULL
。
答案很长:
此查询没有明确GROUP BY
,但由于它使用sum()
聚合行,因此它隐式转换为GROUP BY
查询,所有行都与{{1}匹配条件作为一个群体。
请参阅doc on SELECT:
没有GROUP BY,聚合产生一个计算的单个值 所有选定的行
关于HAVING条款:
即使存在,HAVING也会将查询转换为分组查询 没有GROUP BY子句。这和发生时的情况相同 查询包含聚合函数但不包含GROUP BY子句。一切 选定的行被认为形成一个单独的组和SELECT list和HAVING子句只能从内部引用表列 集合函数。 如果HAVING,这样的查询会发出一行 条件为真,零行如果不是真的。