2015-11-30 64 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。有处理这些类型的查询的最佳做法吗? –