运算符 - Cosmos DB 中的查询语言

Cosmos DB 支持一组全面的运算符,使你能够执行复杂的查询和数据操作。 这些运算符包括按位、相等和比较、逻辑运算符和三元/合并运算符,每个运算符在查询构造和数据处理中都提供特定用途。

位运算符

在构造 JSON 结果集时,按位运算符可用于对整数值执行低级别运算。 这些运算符的工作方式与更高级别的编程语言(如 C# 和 JavaScript)中的类似运算符类似。 有关 C# 位运算符的示例,请参阅 按位运算符和移位运算符

下表描述了 API for NoSQL 中支持的按位作:

操作 Operator Description
左移 << 按指定位数 向左 移动左移值。
右移 >> 按指定位数 向右 移动左手值。
零填充 (无符号) 右移 >>> 将左手值 向右 移动指定的位数,而不填充最左侧的位。
AND & 计算按位逻辑 AND。
OR | 计算按位逻辑 OR。
异或 ^ 计算按位逻辑排他 OR。

Example

以下查询演示每个按位运算符:

SELECT 
    (100 >> 2) AS rightShift,
    (100 << 2) AS leftShift,
    (100 >>> 0) AS zeroFillRightShift,
    (100 & 1000) AS logicalAnd,
    (100 | 1000) AS logicalOr,
    (100 ^ 1000) AS logicalExclusiveOr

此查询返回以下结果:

[
  {
    "rightShift": 25,
    "leftShift": 400,
    "zeroFillRightShift": 100,
    "logicalAnd": 96,
    "logicalOr": 1004,
    "logicalExclusiveOr": 908
  }
]

重要

Cosmos DB 中的按位运算符遵循与 JavaScript 中的按位运算符相同的行为。 JavaScript 将数字存储为 64 位浮点数,但所有按位运算都对 32 位二进制数执行。 在执行按位运算之前,JavaScript 会将数字转换为 32 位有符号整数。 执行按位运算后,结果将转换回 64 位 JavaScript 数字。 有关 JavaScript 中的按位运算符的详细信息,请参阅 Mozilla Developer Network (MDN) Web Docs 上的 JavaScript 二进制位运算符

等式和比较运算符

相等和比较运算符检查两个表达式是否相等,或以关系方式比较它们。 下表显示了 API for NoSQL 中任意两种 JSON 类型之间的相等比较结果:

未定义 Null 布尔 编号 String 物体 Array
未定义 未定义 未定义 未定义 未定义 未定义 未定义 未定义
Null 未定义 Ok 未定义 未定义 未定义 未定义 未定义
布尔值 未定义 未定义 Ok 未定义 未定义 未定义 未定义
数字 未定义 未定义 未定义 Ok 未定义 未定义 未定义
字符串 未定义 未定义 未定义 未定义 Ok 未定义 未定义
对象 未定义 未定义 未定义 未定义 未定义 Ok 未定义
数组 未定义 未定义 未定义 未定义 未定义 未定义 Ok

对于比较运算符,例如 >``, >=, `!=<``, and <=, comparison across types or between two objects or arrays produces `undefined。 如果标量表达式 undefined``, the item isn't included in the result, because 的结果未定义doesn't equate totrue'”。

Example

以下查询比较一个数字和字符串值,该值生成“undefined”。 因此,筛选器不包含任何结果:

SELECT
    *
FROM
    products p
WHERE 
    0 = "true"

逻辑运算符

逻辑运算符将两个表达式与布尔 (true/false)作数进行比较。 以下各节介绍每个逻辑运算符的真相表和优先级。

OR 运算符

当任一条件为“true”时,运算符 ORtrue 返回。

true false undefined
true true true true
false true false undefined
undefined true undefined undefined

AND 运算符

当两个表达式均为“true”时,运算符 ANDtrue 返回。

true false undefined
true true false undefined
false false false false
undefined undefined false undefined

NOT 运算符

运算符 NOT 反转任何布尔表达式的值。

NOT
true false
false true
undefined undefined

运算符优先级

逻辑运算符 OR``, AND',并 NOT 具有以下优先级别:

Operator Priority
NOT 1
AND 2
OR 3

投影运算符

特殊运算符 * 按原样投影整个项。 使用时,它必须是唯一投影的字段。 查询类似SELECT * FROM products p有效,但SELECT VALUE * FROM products pSELECT *, p.id FROM products p无效。

三元和联合运算符

三元运算符和合并运算符根据布尔作数或字段存在来计算表达式并返回结果。 这些运算符与常用编程语言(如 C# 和 JavaScript)中的类似运算符类似。 使用三元运算符(?)和合并(??)运算符生成可复原的半结构化或混合类型数据的条件表达式。

三元运算符

运算符 ? 根据布尔表达式的计算返回值。

Syntax

<bool_expr> ?  
    <expr_true> : 
    <expr_false>

Arguments

Description
bool_expr 布尔表达式。
expr_true 计算结果是否 bool_exprtrue. 的表达式。
expr_false 计算结果是否 bool_exprfalse. 的表达式。

例子

此示例使用包含与定价相关的多个元数据属性的容器中的项。 该 collapsible 属性在所有项上都不存在:

[
  {
    "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``. The query returns the price multiplied by 0.85iftrue, or the price unchanged if `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
  }
]

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

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
  }
]

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

合并运算符

当查询半结构化或混合类型数据时,使用 ?? 运算符有效检查项中的属性。

Example

此查询假定属性不存在的任何项 collapsible 都不可折叠:

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