次の方法で共有


演算子 - Cosmos DB のクエリ言語 (Azure と Fabric)

Cosmos DB (Azure と Fabric) では、複雑なクエリとデータ操作を実行できる包括的な演算子セットがサポートされています。 これらの演算子には、ビットごとの演算子、等値演算子と比較演算子、論理演算子、および三項演算子と結合演算子が含まれます。各演算子は、クエリの構築とデータ処理で特定の目的を果たします。

ビットごとの演算子

ビット演算子は、JSON 結果セットを構築するときに整数値に対して低レベルの操作を実行する場合に便利です。 これらの演算子は、C# や JavaScript などの上位レベルのプログラミング言語で同様の演算子と同様に機能します。 C# ビット演算子の例については、「 ビット演算子とシフト演算子」を参照してください。

次の表では、NoSQL 用 API でサポートされるビットごとの操作について説明します。

Operation Operator Description
左シフト << 左辺の値を指定したビット数だけ にシフトします。
右シフト >> 指定したビット数だけ左辺の値を にシフトします。
ゼロフィル (符号なし) 右シフト >>> 左端の値を、左端のビットを入力せずに、指定したビット数だけ にシフトします。
AND & ビットごとの論理 AND を計算します。
OR | ビットごとの論理 OR を計算します。
XOR ^ ビットごとの論理排他的 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
  }
]

Important

Cosmos DB のビットごとの演算子は、JavaScript のビット演算子と同じ動作に従います。 JavaScript は数値を 64 ビット浮動小数点数として格納しますが、すべてのビットごとの演算は 32 ビットの 2 進数に対して実行されます。 ビットごとの操作を実行する前に、JavaScript は数値を 32 ビット符号付き整数に変換します。 ビットごとの操作が実行されると、結果は 64 ビットの JavaScript 番号に変換されます。 JavaScript のビット演算子の詳細については、 Mozilla Developer Network (MDN) Web Docs の JavaScript バイナリ ビット演算子を参照してください。

等値演算子と比較演算子

等値演算子と比較演算子は、2 つの式の等価性をチェックするか、リレーショナルに比較します。 次の表は、API for NoSQL の 2 つの JSON 型間の等価比較の結果を示しています。

未定義 Null ブール値 Number Object Array
未定義 未定義 未定義 未定義 未定義 未定義 未定義 未定義
ヌル 未定義 OK 未定義 未定義 未定義 未定義 未定義
ブーリアン 未定義 未定義 OK 未定義 未定義 未定義 未定義
Number 未定義 未定義 未定義 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"

論理演算子

論理演算子は、2 つの式をブール型 (true/false) オペランドと比較します。 次のセクションでは、各論理演算子の真理値テーブルと優先順位について説明します。

OR 演算子

OR演算子は、いずれかの条件が 'true' の場合にtrueを返します。

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

AND 演算子

AND演算子は、両方の式が 'true' の場合に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 pまたはSELECT *, p.id FROM products pは無効です。

三項演算子と合体演算子

三項演算子と結合演算子は、式を評価し、ブール型のオペランドまたはフィールドの存在に基づいて結果を返します。 これらの演算子は、C# や JavaScript などの一般的なプログラミング言語で同様の演算子と同様に機能します。 三項 (?) 演算子と合体演算子 (??) を使用して、半構造化データまたは混合型データに対する回復性のある条件式を作成します。

三項演算子

?演算子は、ブール式の評価に基づいて値を返します。

構文

<bool_expr> ?  
    <expr_true> : 
    <expr_false>

論争

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

?演算子の呼び出しを入れ子にすることもできます。 次の使用例は、2 番目のプロパティ (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
  }
]

他のクエリ演算子と同様に、 ? 演算子は、参照されるプロパティが見つからないか、比較される型が異なる場合に項目を除外します。

Coalesce 演算子

??演算子を使用して、半構造化データまたは混合型データに対してクエリを実行するときに、アイテム内のプロパティを効率的にチェックします。

Example

このクエリでは、 collapsible プロパティが存在しないアイテムは折りたたみ不可能であると想定しています。

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