【问题标题】:CosmosDB - OR operator not working with JOINCosmosDB - OR 运算符不使用 JOIN
【发布时间】:2019-02-14 17:37:26
【问题描述】:

我的收藏中有两个文档:

{
  "ViewAll": true,
  "GroupIDs": []
}

和:

{
  "ViewAll": false,
  "GroupIDs": ["super-admin"]
}

我希望以下查询返回两个文档:

SELECT VALUE c FROM c 
JOIN groupIDs in c.GroupIDs
WHERE (c.ViewAll = true OR groupIDs IN("super-admin"))

但是我只取回了第二个文档。

在处理查询时,我注意到如果我排除 WHERE 子句但保留 JOIN,它仍然会将结果集限制为仅具有 GroupID 的结果集

SELECT VALUE c FROM c 
JOIN groupIDs in c.GroupIDs

JOIN 是否因为 GroupIDs 数组中没有条目而限制了结果集?有没有办法得到我想要的结果?

【问题讨论】:

  • 一些数据库以奇怪的方式处理“空”值。我不精通 azure,但请尝试将 groupIDs IN("super-admin") 替换为您的数据库中的 (groupIDs is not null and groupIDs IN("super-admin"))

标签: sql azure-cosmosdb


【解决方案1】:

JOIN 是否限制了结果集,因为其中没有条目 GroupIDs 数组?

答案是肯定的。所以,也许您可​​以使用ARRAY_CONTAINS 而不是 JOIN 来实现您的要求。

SELECT VALUE c FROM c 
where c.ViewAll = true or ARRAY_CONTAINS(c.GroupIDs, "super-admin",true)

输出:

另外,你可以参考我之前的案例:cosmos db query self join with null array

【讨论】:

  • 您根据我给您的信息提供的答案是准确的,因此我给予您信任。尽管现实情况是我的情况比这要复杂一些。我之所以专门使用 IN,是因为我要检查一组 c.GroupID,但我不是只检查一个值“超级管理员”,而是一个值列表。可能是“超级管理员”、“组-a”和“组-b”。如果任何 c.GroupIDs 与我希望在结果中返回的任何一个匹配。有什么想法吗?
猜你喜欢
  • 2015-07-08
  • 2012-12-03
  • 1970-01-01
  • 2019-07-04
  • 1970-01-01
  • 1970-01-01
  • 2014-09-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多