你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

Azure Cosmos DB for NoSQL 中的三元和联合运算符

适用范围: NoSQL

Azure Cosmos DB for NoSQL 中的三元运算符和合并运算符根据布尔操作数或字段是否存在计算表达式并返回结果。 三元运算符和合并运算符的功能与 C# 和 JavaScript 等常用编程语言类似。 使用三元 (?) 和合并 (??) 运算符生成可复原的半结构化或混合类型数据的条件表达式。

三元运算符

? 运算符会根据第一个表达式的计算返回值。

语法

<bool_expr> ?  
    <expr_true> : 
    <expr_false>

参数

说明
bool_expr 一个布尔表达式。
expr_true 如果 bool_expr 计算为 true, 要计算的表达式。
expr_false 如果 bool_expr 计算为 false, 要计算的表达式。

示例

请考虑容器中的这些项。 它们包含多个与定价相关的元数据属性,并且其中一个属性并非在所有项上都存在。

[
  {
    "name": "Stangincy trekking poles",
    "price": 24.50,
    "onCloseout": false,
    "onSale": true,
    "collapsible": true
  },
  {
    "name": "Vimero hiking poles",
    "price": 24.50,
    "onCloseout": false,
    "onSale": false
  },
  {
    "name": "Kramundsen trekking poles",
    "price": 24.50,
    "onCloseout": true,
    "onSale": true,
    "collapsible": false
  }
]

此查询计算表达式 onSale,它等效于 onSale = true。 如果 true,查询则返乘以 0.85 后的价格,如果 false,则返回不变价格。

SELECT
    p.name,
    p.price AS subtotal,
    p.onSale ? (p.price * 0.85) : p.price AS total
FROM
    products p
[
  {
    "name": "Stangincy trekking poles",
    "subtotal": 24.5,
    "total": 20.825
  },
  {
    "name": "Vimero hiking poles",
    "subtotal": 24.5,
    "total": 24.5
  },
  {
    "name": "Kramundsen trekking poles",
    "subtotal": 24.5,
    "total": 20.825
  }
]

还可以将将调用嵌套到 ? 运算符。 此示例基于第二个属性 (taxFree) 添加额外的计算

SELECT
    p.name,
    p.price AS subtotal,
    p.onCloseout ? (p.price * 0.55) : p.onSale ? (p.price * 0.85) : p.price AS total
FROM
    products p
[
  {
    "name": "Stangincy trekking poles",
    "subtotal": 24.5,
    "total": 20.825
  },
  {
    "name": "Vimero hiking poles",
    "subtotal": 24.5,
    "total": 24.5
  },
  {
    "name": "Kramundsen trekking poles",
    "subtotal": 24.5,
    "total": 13.475000000000001
  }
]

与其他查询运算符一样,如果引用的属性缺失或者要比较的类型不同,则 ? 运算符将会排除项。

合并运算符

或混合类型的数据时,可以使用 ?? 运算符有效地检查项中的属性。

例如,此查询假定不存在属性 collapsible 的任何项都不可折叠。

SELECT
    p.name,
    p.collapsible ?? false AS isCollapsible
FROM
    products p