首页 > 解决方案 > 带有 JOIN 的 Azure Cosmos DB (NOT IS_DEFINED OR) 子句始终计算为 false

问题描述

我有一个文件:

{
  contact: {
    id: '123'
  },
  channels: [
    {
      ... some channel info...
    }
  ],
  lastUpdatedEpoch: 1583937675
}

我有以下不返回上述文档的查询:

SELECT p FROM p JOIN c IN p.channels
WHERE (NOT IS_DEFINED(p.lastUpdatedEpoch) OR p.lastUpdatedEpoch < 1585733881)
AND p.contact.id = '123'

但是当我删除 NOT IS_DEFINED 检查时,它会正确返回文档:

SELECT p FROM p JOIN c IN p.channels
WHERE (p.lastUpdatedEpoch < 1585733881)
AND p.contact.id = '123'

我还尝试将 NOT IS_DEFINED 子句替换为 FALSE 并返回文档:

SELECT p FROM p JOIN c IN p.channels
WHERE (FALSE OR p.lastUpdatedEpoch < 1585733881)
AND p.contact.id = '123'

此外,如果我删除 JOIN,查询将按预期工作并返回文档:

SELECT p FROM
WHERE (NOT IS_DEFINED(p.lastUpdatedEpoch) OR p.lastUpdatedEpoch < 1585733881)
AND p.contact.id = '123'

对我来说,这种行为是出乎意料的。定义 lastUpdatedEpoch 时,我希望第一个和第二个查询的结果相同(除了 NOT_ISDEFINED 将导致不使用索引这一事实之外)。有人可以解释一下这里发生了什么吗?

标签: azure-cosmosdb

解决方案


我尝试在我这边重现您的问题,但失败了。结果对我来说是预期的。

测试样本数据:

在此处输入图像描述

Sql 输出:

在此处输入图像描述

看来你没有引用任何列。channels我建议你创建一些简单的测试数据来验证你的sql是否正确。然后尝试与你的实际数据进行比较。


推荐阅读