0

我有一个资源预订数据库(在 postgres 9.3 上运行)。此数据库包含一个表reservations,其中包含除其他值之外的预订的开始和停止时间(as 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'

如果给定的公司对未来有保留,这将非常有效。我遇到的问题是,当公司没有任何保留时,查询实际上返回一行但列total是空的,而我希望它根本不返回任何行(或者0如果没有什么太复杂,则包含一行)那个案子。

这是否可以通过SELECT对数据库进行不同或其他修改来完成,或者消费应用程序是否null每次都必须检查?

对不起,如果我的问题是微不足道的,但我对数据库完全陌生


编辑

我发现我可以0通过 using默认返回值,COALESCE但如果不返回任何行,我会更喜欢它

4

1 回答 1

1

简短回答:只需HAVING Sum(stop-start) IS NOT NULL在查询末尾添加即可。

长答案:这个查询没有明确GROUP BY的,但由于它聚合了行sum(),所以它隐式地变成了一个GROUP BY查询,所有符合WHERE条件的行被视为一组。

请参阅SELECT 上的文档

如果没有 GROUP BY,聚合会生成一个跨所有选定行计算的值

关于 HAVING 子句:

即使没有 GROUP BY 子句,HAVING 的存在也会将查询变成分组查询。这与查询包含聚合函数但没有 GROUP BY 子句时发生的情况相同。所有选定的行都被认为形成一个组,并且 SELECT 列表和 HAVING 子句只能从聚合函数中引用表列。如果 HAVING 条件为真,这样的查询将发出单行,如果不为真,则发出零行。

于 2013-11-13T14:28:57.997 回答