【问题标题】:Azure Comos - order by empty array elementAzure Cosmos - 按空数组元素排序
【发布时间】:2019-12-17 12:34:19
【问题描述】:

我有一个具有数组属性的数据集。比如我select * from c:

[
  {
    "id": "1",
    "props": []
  },
  {
    "id": "2",
    "props": ["a"]
  },
  {
    "id": "3",
    "props": ["b"]
  }
]

我想运行此查询以按 props 列排序:

select * from c order by c.props

但是它返回 0 条记录,因为第一个数组项是空的(如果我删除订单,它可以正常工作并返回三个记录)。我可以这样做来尝试解决它:

select c.* as item, props = [] ? '' : props[0] as orderCol from c

返回所有三个项目(没有 order by)但是当我尝试像这样应用 order by 时:

select c.* as item, props = [] ? '' : props[0] as orderCol from c order by c.orderCol

返回 0 条记录。我究竟做错了什么? (我不想要 where 子句来过滤空的道具记录)。基本上,我无法按我的自定义选择字段 "orderCol" 进行排序。

注意:使用 order by c.id 可以正常工作!

提前感谢您的任何指点!

【问题讨论】:

  • 数组属性是否只有一个项目?奇怪的是,为什么 order by 通常会导致 0 结果,这似乎是错误的,尽管按数组属性排序并不是我想说的常见或预期的事情,因为可能有多个项目。
  • 真的想按第一个数组项默认排序 - 似乎根本不起作用
  • 可能你得到了一个错误,而不仅仅是零结果?
  • 尝试使用自定义字段时出错
  • 不确定如何使用数组进行排序,因为数组可以包含可变数量的项目——这没有任何意义。至于缺失项:目前的索引只包括包含相关属性的文档;见我的回答here,与此相关。

标签: sql azure azure-cosmosdb


【解决方案1】:

测试了您的场景并获得了相同的结果。似乎 order by 可以映射到文档路径并且不能包含未定义的列。我建议你使用下面的sql:

select c.id,IS_DEFINED(c.props[0]) ? c.props[0]:"" as propsVal from c

输出:

然后通过编码对结果进行排序,比如.NET中的Array.Sort()方法。

【讨论】:

  • 感谢您的尝试,看起来不可能。
  • @RobMcCabe 是的,我想是的。也许您可以向 cosmos db 团队提交反馈,因为我认为这是一个常见的功能。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-01
  • 1970-01-01
  • 2016-02-01
  • 1970-01-01
相关资源
最近更新 更多