Операторы — язык запросов в Cosmos DB (в Azure и Fabric)

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