Поделиться через


JSON_VALUE (Transact-SQL)

Область применения: SQL Server 2016 (13.x) и более поздних версий База данных SQL Azure Управляемый экземпляр SQL Azure Azure Synapse Analytics

Извлекает скалярное значение из строки JSON.

Чтобы узнать, как извлечь объект или массив, а не скалярное значение из строки JSON, см. статью JSON_QUERY (Transact-SQL). Дополнительные сведения о различиях между JSON_VALUE JSON_QUERYними см. в разделе "Сравнение JSON_VALUE" и JSON_QUERY.

Соглашения о синтаксисе Transact-SQL

Синтаксис

JSON_VALUE ( expression , path )  

Аргументы

выражение

Выражение . Обычно имя переменной или столбца, содержащего текст JSON.

Если JSON_VALUE объект JSON недействителен в выражении перед поиском значения, определяемого по пути, функция возвращает ошибку. Если JSON_VALUE значение, определенное по пути, не найдено, он сканирует весь текст и возвращает ошибку, если он находит JSON, который не является допустимым в любом месте выражения.

path

Путь JSON, указывающий на извлекаемое свойство. Дополнительные сведения см. в статье Выражения пути JSON (SQL Server).

В SQL Server 2017 (14.x) и в База данных SQL Azure можно указать переменную в качестве значения пути.

Если формат пути недействителен, JSON_VALUE возвращает ошибку.

Возвращаемое значение

Возвращает одно текстовое значение типа nvarchar(4000). Параметры сортировки для возвращаемого значения совпадают с параметрами сортировки входного выражения.

Если длина значения превышает 4000 символов:

  • В режиме JSON_VALUE lax возвращается NULL.

  • В строгом режиме JSON_VALUE возвращает ошибку.

Если необходимо возвращать скалярные значения, превышающие 4000 символов, используйте OPENJSON вместо JSON_VALUEнего. Дополнительные сведения см. в разделе OPENJSON (Transact-SQL).

Функции JSON работают одинаково, хранится ли документ JSON в varchar, nvarchar или в собственном типе данных JSON.

Замечания

Нестрогий и строгий режимы

Рассмотрим следующий текст JSON:

DECLARE @jsonInfo NVARCHAR(MAX)

SET @jsonInfo=N'{  
     "info":{    
       "type":1,  
       "address":{    
         "town":"Bristol",  
         "county":"Avon",  
         "country":"England"  
       },  
       "tags":["Sport", "Water polo"]  
    },  
    "type":"Basic"  
 }'  

В следующей таблице сравнивается поведение JSON_VALUE в нестрогом режиме и в строгом режиме. Дополнительные сведения о необязательном режиме пути (строгий или нестрогий) см. в статье Выражения пути JSON (SQL Server).

Путь Возвращаемое значение в нестрогом режиме Возвращаемое значение в строгом режиме Дополнительная информация
$ NULL Ошибка Не является скалярным значением.

Вместо этого используйте JSON_QUERY.
$.info.type N'1' N'1' Недоступно
$.info.address.town N'Bristol' N'Bristol' Недоступно
$.info."address" NULL Ошибка Не является скалярным значением.

Вместо этого используйте JSON_QUERY.
$.info.tags NULL Ошибка Не является скалярным значением.

Вместо этого используйте JSON_QUERY.
$.info.type[0] NULL Ошибка Не является массивом.
$.info.none NULL Ошибка Свойство не существует.

Примеры

Пример 1

В приведенном ниже примере в результатах запроса используются значения свойств JSON town и state. Так как JSON_VALUE сохраняет параметры сортировки источника, порядок сортировки результатов зависит от сортировки столбца jsonInfo .

Примечание.

(В этом примере предполагается, что таблица с именем Person.Person содержит jsonInfo столбец текста JSON, и что этот столбец имеет структуру, показанную ранее в обсуждении неструктурированного режима и строгого режима. AdventureWorks В примере базы данных Person таблица фактически не содержит jsonInfo столбец.)

SELECT FirstName, LastName,
 JSON_VALUE(jsonInfo,'$.info.address.town') AS Town
FROM Person.Person
WHERE JSON_VALUE(jsonInfo,'$.info.address.state') LIKE 'US%'
ORDER BY JSON_VALUE(jsonInfo,'$.info.address.town')

Пример 2

В приведенном ниже примере извлекается значение свойства JSON town в локальную переменную.

DECLARE @jsonInfo NVARCHAR(MAX)
DECLARE @town NVARCHAR(32)

SET @jsonInfo=N'{"info":{"address":[{"town":"Paris"},{"town":"London"}]}}';

SET @town=JSON_VALUE(@jsonInfo,'$.info.address[0].town'); -- Paris
SET @town=JSON_VALUE(@jsonInfo,'$.info.address[1].town'); -- London

Пример 3

В приведенном ниже примере создаются вычисляемые столбцы на основе значений свойств JSON.

CREATE TABLE dbo.Store
 (
  StoreID INT IDENTITY(1,1) NOT NULL,
  Address VARCHAR(500),
  jsonContent NVARCHAR(4000),
  Longitude AS JSON_VALUE(jsonContent, '$.address[0].longitude'),
  Latitude AS JSON_VALUE(jsonContent, '$.address[0].latitude')
 )