[英]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
条件匹配的行都作为一个组。
如果没有GROUP BY,则汇总会产生一个跨所有选定行计算的单个值
关于HAVING子句:
即使没有GROUP BY子句,HAVING的存在也会将查询转换为分组查询。 这与查询包含聚合函数但不包含GROUP BY子句的情况相同。 所有选定的行都被视为形成一个单一的组,并且SELECT列表和HAVING子句只能引用聚合函数中的表列。 如果HAVING条件为true,则此类查询将发出单行;如果条件为true,则将发出零行。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.