共用方式為


運算子 - Cosmos DB 中的查詢語言 (在 Azure 和 Fabric 中)

Cosmos DB (在 Azure 和 Fabric) 支援一組完整的運算子,可讓您執行複雜的查詢和資料操作。 這些運算子包括按位、相等和比較、邏輯和三元/合併運算子,每個運算子在查詢建構和資料處理中都有特定的用途。

位元運算子

位運算子對於在建構 JSON 結果集時對整數值執行低階運算非常有用。 這些運算子的工作方式與 C# 和 JavaScript 等高階程式語言中的類似運算子類似。 如需 C# 位元運算子的範例,請參閱 位元運算子和移位運算子

下表說明 API for NoSQL 中支援的位元運算:

行動 Operator Description
左移 << 將左邊值向 移動指定的位數。
右移 >> 將左側值向 移動指定的位數。
零填充(無符號)右移 >>> 將左邊值向 移動指定的位數,而不填入最左邊的位。
& 計算位元邏輯 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 開發人員網路 (MDN) Web 文件中的 JavaScript 二進位位元運算子

相等和比較運算子

相等和比較運算子會檢查兩個運算式的對等性,或以關聯方式比較它們。 下表顯示 API for NoSQL 中任意兩種 JSON 類型之間的相等比較結果:

未定義 Null 布林值 Number 繩子 物體 Array
未定義 定義 定義 定義 定義 定義 定義 定義
定義 確定 定義 定義 定義 定義 定義
布爾值 定義 定義 確定 定義 定義 定義 定義
Number 定義 定義 定義 確定 定義 定義 定義
字串 定義 定義 定義 定義 確定 定義 定義
物件 定義 定義 定義 定義 定義 確定 定義
陣列 定義 定義 定義 定義 定義 定義 確定

對於比較運算子,例如 >``, >=, `!=<``, 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'' 時,運算子會傳回true

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

「和」運算子

AND當兩個運算式都為 'true'' 時,運算子會傳回true

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

「非」運算子

運算子會 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 等流行程式語言中的類似運算子類似。 使用三元運算子 (?) 和??聯合運算子來建置條件運算式,這些運算式可針對半結構化或混合類型資料進行復原。

三元運算子

運算子會 ? 根據布林運算式的評估傳回值。

語法

<bool_expr> ?  
    <expr_true> : 
    <expr_false>

Arguments

Description
bool_expr 布林運算式。
expr_true 要評估 if bool_expr 的運算式 評估 true為 。
expr_false 要評估 if 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