Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Cosmos DB (в Azure и Fabric) поддерживает комплексный набор операторов, позволяющих выполнять сложные запросы и манипуляции данными. К этим операторам относятся побитовая, равенство и сравнение, логические и тернарные или объединенные операторы, каждая из которых служит для конкретных целей в создании запросов и обработке данных.
битовые операторы
Побитовые операторы полезны для выполнения низкоуровневых операций с целыми значениями при создании результирующих наборов JSON. Эти операторы работают аналогично аналогичным операторам на более высоких языках программирования, таких как C# и JavaScript. Примеры побитовых операторов C# см. в операторах bitwise и shift.
В следующей таблице описаны побитовые операции, поддерживаемые в API для NoSQL:
| Операция | Operator | Description |
|---|---|---|
| Смена влево | << |
Переместите значение влево по указанному числу битов. |
| Смена вправо | >> |
Переместите значение влево вправо по указанному числу битов. |
| Отсчитываемый от нуля (без знака) сдвиг вправо | >>> |
Переместите значение влево вправо по указанному количеству битов без заполнения левых битов. |
| AND | & |
Вычисляет побитовую логическую И. |
| OR | | |
Вычисляет побитовую логическую ИЛИ. |
| XOR | ^ |
Вычисляет побитовую логическую эксклюзивную ИЛИ. |
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 см. в веб-документах Побитовой документации по JavaScript в сети разработчиков Mozilla (MDN).
Операторы равенства и сравнения
Операторы равенства и сравнения проверяют два выражения для эквивалентности или сравнивают их реляционно. В следующей таблице показан результат сравнения равенства между двумя типами JSON в API для NoSQL:
| неопределенный | Null | Boolean | Number | String | Object | Массив | |
|---|---|---|---|---|---|---|---|
| неопределенный | Undefined | Undefined | Undefined | Undefined | Undefined | Undefined | Undefined |
| Недействительный | Undefined | Ok | Undefined | Undefined | Undefined | Undefined | Undefined |
| Boolean | Undefined | Undefined | Ok | Undefined | Undefined | Undefined | Undefined |
| Число | Undefined | Undefined | Undefined | Ok | Undefined | Undefined | Undefined |
| строка | Undefined | Undefined | Undefined | Undefined | Ok | Undefined | Undefined |
| Объект | Undefined | Undefined | Undefined | Undefined | Undefined | Ok | Undefined |
| массива | Undefined | Undefined | Undefined | Undefined | Undefined | Undefined | 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 toкак true'.
Example
Следующий запрос сравнивает число и строковое значение, которое создает "неопределено". Поэтому фильтр не содержит никаких результатов:
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 p или SELECT *, p.id FROM products p недопустимый.
Тернарный оператор и оператор объединения
Тернари и операторы объединения оценивают выражения и возвращаемые результаты на основе логических операндов или существования полей. Эти операторы работают аналогично аналогичным операторам на популярных языках программирования, таких как C# и JavaScript. Используйте ternary () и операторы объединения (???) для создания условных выражений, устойчивых к полуструктурированных или смешанных данных.
Оператор Ternary
Оператор ? возвращает значение на основе вычисления логического выражения.
Синтаксис
<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