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”时,运算符 OR 将 true 返回。
true |
false |
undefined |
|
|---|---|---|---|
true |
true |
true |
true |
false |
true |
false |
undefined |
undefined |
true |
undefined |
undefined |
AND 运算符
当两个表达式均为“true”时,运算符 AND 将 true 返回。
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_expr 的结果是否为 true 的表达式。 |
expr_false |
用于判断 bool_expr 是否求值为 false 的表达式。 |
例子
此示例使用包含与定价相关的多个元数据属性的容器中的项。 该 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