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,完全匹配需求。
之前尝试的语句问题分析
第一条语句使用内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 emailCosmos DB的JOIN是内连接,只有当子查询返回结果时才会生成文档,因此没有主邮箱的Jane Doe被过滤。
第二条语句使用JOIN加WHERE条件:
SELECT c.id, c.firstName, c.lastName, e.email FROM c JOIN e IN c.emails WHERE e.isPrimary = true同样是内连接逻辑,只有存在匹配的主邮箱时才会返回文档,无主邮箱的记录被过滤。
第三条语句的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
相关产品推荐
相关产品推荐

