JSON_VALUE (Transact-SQL)

适用于:SQL Server 2016 (13.x)及更高版本 Azure SQL 数据库Azure SQL 托管实例Azure Synapse AnalyticsMicrosoft Fabric 中的 SQL 分析终结点Microsoft Fabric 中的仓库Microsoft Fabric 预览版中的 SQL 数据库

语法 JSON_VALUE 从 JSON 字符串中提取标量值。

若要从 JSON 字符串而不是标量值中提取对象或数组,请参阅 JSON_QUERY(Transact-SQL)。 有关 JSON_VALUEJSON_QUERY 之间差异的信息,请参阅比较 JSON_VALUE 和 JSON_QUERY

Transact-SQL 语法约定

Syntax

JSON_VALUE ( expression , path )  

Arguments

expression

An expression. 通常是包含 JSON 文本的变量或列的名称。

如果在JSON_VALUE找到路径标识的值之前在表达式中找不到无效的 JSON,该函数将返回错误。 如果未 JSON_VALUE 找到 路径标识的值,它将扫描整个文本,如果找到 表达式中任何位置无效的 JSON,则会返回错误。

path

指定要提取属性的 JSON 路径。 有关详细信息,请参阅 JSON 路径表达式

在 SQL Server 2017(14.x)和 Azure SQL 数据库中,可以将变量作为 路径的值提供。

如果 路径 的格式无效, JSON_VALUE 则返回错误。

Return value

返回 nvarchar(4000) 类型的单个文本值。 返回值的排序规则与输入表达式的排序规则相同。

如果值大于 4000 个字符:

  • 在宽松模式下,JSON_VALUE 返回 NULL

  • 在严格模式下,JSON_VALUE 返回错误。

如果必须返回大于 4000 个字符的标量值,请使用 OPENJSON 而不是 JSON_VALUE。 有关详细信息,请参阅 OPENJSON(Transact-SQL)。

无论 JSON 文档存储在 varcharnvarchar 还是本机 json 数据类型中,JSON 函数的工作方式都相同。

Remarks

宽松模式和严格模式

请参考以下 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 路径表达式

Path 宽松模式下的返回值 严格模式下的返回值 More info
$ NULL Error 不是标量值。

请改用 JSON_QUERY
$.info.type N'1' N'1' N/a
$.info.address.town N'Bristol' N'Bristol' N/a
$.info."address" NULL Error 不是标量值。

请改用 JSON_QUERY
$.info.tags NULL Error 不是标量值。

请改用 JSON_QUERY
$.info.type[0] NULL Error 不是数组。
$.info.none NULL Error 属性不存在。

Examples

Example 1

以下示例在查询结果中使用 JSON 属性 townstate 的值。 由于 JSON_VALUE 保留了源的排序规则,因此结果的排序顺序取决于 jsonInfo 列的排序规则。

Note

(此示例假定名为 Person.Person 的表包含 JSON 文本的 jsonInfo 列,并且此列具有前面讨论的宽松模式和严格模式中显示的结构。在 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')

Example 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

Example 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')
 )