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. Вы сможете делать умный выбор на уровне базы данных.
Обратные ссылки
Автор не разрешил комментировать эту запись
Комментарии
Показывать комментарии Как список | Древовидной структурой