簡體   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