2015-11-30 106 views
1

使用OrientDB 2.1.2,我試圖使用固有的COALESCE功能,並遇到一些奇怪的結果。OrientDB COALESCE函數意外的結果

目標:根據特定條件選擇屬性的最大值或0如果在給定條件的情況下沒有該屬性的值。

這是我試圖用來產生我的結果。

嘗試1:只要選擇基於某些條件屬性的最大值 - 這個工作如我所料...一個結果 enter image description here

嘗試2:前面一個查詢相同,但現在我加入一個額外的條件,我知道不會造成任何結果返回 - 這還擔任過我的預期......沒有結果發現 enter image description here

嘗試3:使用COALESCE選擇0,如果從第二個查詢結果返回任何結果 - 這是查詢失敗的地方(見下文)。 enter image description here

我希望從第二查詢返回的結果沒有結果,從而有資格成爲「空」的結果意味着該COALESCE函數應該然後繼續返回0,會發生什麼,而不是在於COALESCE功能看到內部select的結果(它再次返回沒有結果)作爲有效的非空值,導致COALESCE函數永遠不會返回預期的「0」值。

對於那些

兩個問題誰是熟悉使用OrientDB API:

  1. 你覺得這個功能是否工作正常或應該的問題與orientdb問題跟蹤備案?
  2. 有沒有另一種方法來實現我的目標,而不使用COALESCE或以不同的方式使用COALESCE?

回答

1

嘗試,而:

select coalesce($a, 0) from ... let $a = (subquery) where ... 

或者也該變體,因爲子選擇返回結果集,但合併想要一個單值:

select coalesce($a[0], 0) from ... let $a = (subquery) where ... 
+0

感謝@Lvca我會嘗試一下。我很想看到這個功能(使用合併中的子選擇)自動處理,以幫助從關係數據庫SQL領域轉移的人員快速獲取orientdb的SQL類API。它比直觀地理解一個沒有返回條目的子選擇的處理方式不同於null!也許這可能是一個更高版本的orientdb的特性要求? –

+0

當然,請在我們的問題跟蹤器(GirHub)上打開一個新問題 – Lvca

+0

一般來說,如何在WHERE子句中處理子查詢?像...... ...從vertexClassA中選擇foo,其中someField =(從vertexFieldB中選擇max(someOtherField))'這些類型的查詢總是失敗,因爲我期望子查詢的結果被視爲原始JSON類型,不是ResultSet。有處理這些類型的查詢的最佳做法嗎? –