繁体   English   中英

选择计算值总是返回行

[英]Select of calculated value always returns row

我有一个资源预订数据库(在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'

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

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

抱歉,如果我的问题很琐碎,但我对数据库完全陌生


编辑

我发现我可以使用COALESCE将返回值默认为0 ,但是如果不返回任何行,我会更喜欢它

简短答案 :只需在查询结束时添加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条件为true,则此类查询将发出单行;如果条件为true,则将发出零行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM