[英]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.