Реализация проверки типов в запросах

Завершено

Одним из преимуществ Azure Cosmos DB для NoSQL в качестве хранилища данных является гибкость хранения данных с различными структурами и фигурами. По мере создания запросов разработчика для этих данных ответственность за проверку типов часто приходится на ваши запросы. Язык запросов SQL для API NoSQL содержит набор встроенных функций, чтобы можно было проверить типы свойств или выражений на лету, когда они переменные или неизвестны.

До сих пор пример структуры данных прост и прост в понимании. Но давайте рассмотрим некоторые возможные исключения.

У каждого элемента product в контейнере есть свойство под названием tags ("теги"). Свойство тегов — это массив объектов со свойствами id и name. До этого момента предполагалось, что для каждого товара в контейнере всегда имеется массив тегов. Но если убрать это исходное предположение, может возникнуть ситуация, когда новый элемент товара добавляется в контейнер без свойства тега, как в следующем примере:

{
    "id": "6374995F-9A78-43CD-AE0D-5F6041078140",
    "categoryid": "3E4CEACD-D007-46EB-82D7-31F6141752B2",
    "sku": "FR-R38R-60",
    "name": "LL Road Frame - Red, 60",
    "price": 337.22
}

Для начала можно использовать встроенную функцию IS_DEFINED для проверки наличия свойства tags у этого элемента:

SELECT
    IS_DEFINED(p.tags) AS tags_exist
FROM
    products p
[
    {
        "tags_exist": false
    }
]

Предположим, что свойство тегов существует, но является не массивом, а другим типом свойства:

{
    "id": "6374995F-9A78-43CD-AE0D-5F6041078140",
    "categoryid": "3E4CEACD-D007-46EB-82D7-31F6141752B2",
    "sku": "FR-R38R-60",
    "name": "LL Road Frame - Red, 60",
    "price": 337.22,
    "tags": "fun, sporty, rad"
}

Можно воспользоваться встроенной функцией IS_ARRAY, чтобы проверить, является ли свойство тегов массивом:

SELECT
    IS_ARRAY(p.tags) AS tags_is_array
FROM
    products p

Также можно проверить, имеет ли свойство тегов значение null и использует ли оно встроенную функцию IS_NULL:

SELECT
    IS_NULL(p.tags) AS tags_is_null
FROM
    products p

Существует еще несколько встроенных функций для различных сценариев с другими типами данных.

Например, рассмотрим ситуацию, когда различные хранилища данных непоследовательно сохраняют сведения о ценах. Одни из них сохраняют информацию с помощью строковых данных, другие — с помощью чисел. Встроенную функцию IS_NUMBER можно использовать в выражении "where" наших запросов:

SELECT
    p.id,
    p.price, 
    (p.price * 1.25) AS priceWithTax
FROM
    products p
WHERE
    IS_NUMBER(p.price)

Также можно воспользоваться встроенной функцией IS_STRING, чтобы проверить, является ли цена строкой, и не применять форматирование:

SELECT
    p.id,
    p.price
FROM
    products p
WHERE
    IS_STRING(p.price)

Существуют другие встроенные функции для проверки типов, включая IS_OBJECT и IS_BOOLEAN.