Implementowanie sprawdzania typów zapytań

Ukończone

Jedną z zalet usługi Azure Cosmos DB dla bazy danych NoSQL jako magazynu danych jest elastyczność przechowywania danych o różnych strukturach i kształtach. Jako deweloper, który tworzy zapytania do tych danych, odpowiedzialność za sprawdzanie typów często spada na ciebie. Język zapytań SQL dla interfejsu API NoSQL zawiera zestaw wbudowanych funkcji, aby umożliwić sprawdzanie typów właściwości lub wyrażeń na bieżąco, gdy są zmienne lub nieznane.

Do tej pory przykładowa struktura danych jest prosta i łatwa do zrozumienia. Rozważmy jednak pewne możliwe wyjątki.

Każdy element produktu w kontenerze ma właściwość o nazwie tags. Właściwość tagów to tablica obiektów z właściwościami id i name. Założeniem do tej pory jest to, że tablica tagów zawsze istnieje dla każdego produktu w kontenerze. Jeśli jednak usuniemy to założenie odniesienia, możemy mieć sytuację, w której nowy element produktu zostanie wstawiony do kontenera bez właściwości tagu, takiej jak w tym przykładzie:

{
    "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
}

Najpierw możemy użyć wbudowanej IS_DEFINED funkcji, aby sprawdzić, czy właściwość tags istnieje w ogóle w tym elemencie:

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

Załóżmy, że właściwość tags istnieje, ale nie jest tablicą; jest to inny typ właściwości:

{
    "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"
}

Możemy użyć wbudowanej IS_ARRAY funkcji, aby sprawdzić, czy właściwość tags jest tablicą:

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

Możemy również sprawdzić, czy właściwość tags ma wartość null , czy nie używa wbudowanej IS_NULL funkcji:

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

Istnieją jeszcze bardziej wbudowane funkcje dla różnych scenariuszy obejmujących inne typy danych.

Rozważmy na przykład sytuację, w której różne magazyny danych przechowują informacje o cenach w niespójny sposób. Niektóre utrwalają informacje o cenach przy użyciu danych ciągów, podczas gdy inne mogą przechowywać informacje o cenach przy użyciu liczb. Wbudowana funkcja IS_NUMBER może być używana w klauzuli WHERE w naszych zapytaniach:

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

Możemy również użyć wbudowanej funkcji IS_STRING, aby sprawdzić, czy nasza cena jest ciągiem i nie stosować żadnego formatowania.

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

Istnieją inne wbudowane funkcje sprawdzania typów, w tym IS_OBJECT i IS_BOOLEAN.