Skip to content

JSON_PATH_EXISTS дает вам больше власти над документами JSON в SQL Server

Пересказ статьи Hasan Savran. JSON_PATH_EXISTS gives you more power over JSON documents in SQL Server


Схемы могут легко изменяться, если вы сохраняете данные в формате JSON. Очень легко добавить или удалить свойства из документов JSON. Когда модель данных меняется быстро, вам придется побеспокоиться о том, существует ли свойство в документе, которое вы разыскиваете. Если путь, который вы ищете, не существует в некоторых документах, вам потребуется так или иначе обработать исключение. Функция JSON_PATH_EXISTS приходит на помощь в подобных ситуациях. Она проверяет наличие конкретного пути во входном документе.

JSON_PATH_EXISTS (value_expression, sql_json_path)

value_expression - источник для тестирования. Это может быть непосредственно закодированный JSON или значение, взятое из таблицы или файла.
sql_json_path - путь, существование которого вы хотите проверить в источнике.

Если путь существует в источнике, функция возвращает 1. Если путь не существует, возвращается 0. Если путь или источник являются NULL, функция возвращает NULL. Эта функция не возвращает никаких ошибок. На выходе будет 0, 1 или NULL.

Я буду использовать следующий документ JSON в качестве источника для примеров. Это документ JSON из доступной базы данных WideWorldImporters.



Как видно в этом документе, схема Event различается для каждого события. Вы можете захотеть отобразить Status текущего события на своей странице. Похоже, что вам потребуется жестко закодировать события, которые Ready for Collection, поскольку тут нет свойства Status. Мы можем использовать в этом случае JSON_PATH_EXISTS и контролировать вывод.

Следующий пример возвращает Delivered поскольку Events[1] имеет свойство Status.

SELECT CASE 
WHEN JSON_PATH_EXISTS(ReturnedDeliveryData, '$.Events[1].Status') = 0
THEN 'Ready'
WHEN JSON_PATH_EXISTS(ReturnedDeliveryData, '$.Events[1].Status') = 1
THEN JSON_VALUE(ReturnedDeliveryData,'$.Events[1].Status')
END as invoicestatus
FROM Sales.Invoices
WHERE InvoiceId = 1

Следующий пример возвращает Ready, поскольку Events[0] не имеет свойства Status.

SELECT CASE 
WHEN JSON_PATH_EXISTS(ReturnedDeliveryData, '$.Events[0].Status') = 0
THEN 'Ready'
WHEN JSON_PATH_EXISTS(ReturnedDeliveryData, '$.Events[0].Status') = 1
THEN JSON_VALUE(ReturnedDeliveryData,'$.Events[0].Status')
END as invoicestatus
FROM Sales.Invoices
WHERE InvoiceId = 1

Благодаря функции JSON_PATH_EXISTS, вы сможете лучше управлять данными JSON. Вы сможете делать умный выбор на уровне базы данных.
Категории: T-SQL

Обратные ссылки

Нет обратных ссылок

Комментарии

Показывать комментарии Как список | Древовидной структурой

Нет комментариев.

Автор не разрешил комментировать эту запись

Добавить комментарий

Enclosing asterisks marks text as bold (*word*), underscore are made via _word_.
Standard emoticons like :-) and ;-) are converted to images.

To prevent automated Bots from commentspamming, please enter the string you see in the image below in the appropriate input box. Your comment will only be submitted if the strings match. Please ensure that your browser supports and accepts cookies, or your comment cannot be verified correctly.
CAPTCHA

Form options

Добавленные комментарии должны будут пройти модерацию прежде, чем будут показаны.