You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure Cosmos DB子查询返回值或NULL的实现问题

在Azure Cosmos DB中查询人员信息并返回主邮箱或NULL

我存储的Person文档结构如下:

{
   "id": "some-id",
   "firstName": "John",
   "lastName": "Doe",
   "emails": [
      {
         "id": "email1",
         "email": "test@testsite.com",
         "isPrimary": true
      },
      {
         "id": "email2",
         "email": "test2@testsite.com",
         "isPrimary": false
      }
   ]
},
{
   "id": "some-other-id",
   "firstName": "Jane",
   "lastName": "Doe",
   "emails": []
}

需求:获取所有人员记录,返回基本信息;若存在主邮箱则仅返回该邮箱,无邮箱或无主邮箱时email字段返回NULL。

正确的SQL查询语句

SELECT 
    c.id,
    c.firstName,
    c.lastName,
    ARRAY_FIRST(ARRAY_FILTER(c.emails, e => e.isPrimary = true)).email AS email
FROM c

语句说明

  • ARRAY_FILTER(c.emails, e => e.isPrimary = true):从emails数组中筛选出所有标记为主邮箱的元素
  • ARRAY_FIRST(...):取筛选结果的第一个元素(通常一个用户只会有一个主邮箱,若存在多个也仅返回第一个)
  • 若筛选结果为空数组(无邮箱或无主邮箱),ARRAY_FIRST会返回NULL,对应的email字段自然为NULL,完全匹配需求。

之前尝试的语句问题分析

  1. 第一条语句使用内JOIN子查询:

    SELECT c.id, c.firstName, c.lastName, email
    FROM c JOIN (SELECT e.email FROM e IN c.emails WHERE e.isPrimary = true) AS email
    

    Cosmos DB的JOIN是内连接,只有当子查询返回结果时才会生成文档,因此没有主邮箱的Jane Doe被过滤。

  2. 第二条语句使用JOIN加WHERE条件:

    SELECT c.id, c.firstName, c.lastName, e.email
    FROM c JOIN e IN c.emails
    WHERE e.isPrimary = true
    

    同样是内连接逻辑,只有存在匹配的主邮箱时才会返回文档,无主邮箱的记录被过滤。

  3. 第三条语句的WHERE条件逻辑错误:

    SELECT c.id, c.firstName, c.lastName, e.email
    FROM c JOIN e IN c.emails
    WHERE ARRAY_LENGTH(c.emails) = 0 OR e.isPrimary = true
    

    当ARRAY_LENGTH(c.emails)=0时,JOIN e IN c.emails没有结果,无法匹配该条件;同时有邮箱但无主邮箱的文档也因JOIN后无匹配的e被过滤,不符合需求。

内容的提问来源于stack exchange,提问作者Sam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 16:05:59