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_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
}
]
?演算子の呼び出しを入れ子にすることもできます。 次の使用例は、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