JSON_VALUE (Transact-SQL)
适用于: SQL Server 2016 (13.x) 及更高版本 Azure SQL 数据库Azure SQL 托管实例Azure Synapse Analytics
从 JSON 字符串中提取标量值。
若要从 JSON 字符串而不是标量值中提取对象或数组,请参阅 JSON_QUERY (Transact-SQL)。 有关 JSON_VALUE 和 JSON_QUERY 之间差异的信息,请参阅比较 JSON_VALUE 和 JSON_QUERY 。
语法
JSON_VALUE ( expression , path )
参数
expression
一个表达式。 通常是包含 JSON 文本的变量或列的名称。
如果 JSON_VALUE 在找到由 path 标识的值之前,找到在 expression 中无效的 JSON,则函数会返回错误。 如果 JSON_VALUE 找不到路径标识的值,则它将扫描整个文本,如果在表达式中的任何位置发现无效的 JSON,则返回错误。
路径
指定要提取属性的 JSON 路径。 有关详细信息,请参阅 JSON 路径表达式 (SQL Server)。
在 SQL Server 2017 (14.x) 和 Azure SQL 数据库 中,可提供变量作为 path 的值。
如果 path 格式无效,则 JSON_VALUE 返回错误。
返回值
返回 nvarchar(4000) 类型的单个文本值。 返回值的排序规则与输入表达式的排序规则相同。
如果值大于 4000 个字符:
在宽松模式下,JSON_VALUE 返回 NULL。
在严格模式下,JSON_VALUE 返回错误。
如果必须返回大于 4000 个字符的标量值,请使用 OPENJSON 而不是 JSON_VALUE。 有关详细信息,请参阅 OPENJSON (Transact-SQL)。
备注
宽松模式和严格模式
请参考以下 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
的表包含 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')
示例 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')
)
另请参阅
反馈
https://aka.ms/ContentUserFeedback.
Coming soon: Throughout 2024 we will be phasing out GitHub Issues as the feedback mechanism for content and replacing it with a new feedback system. For more information see:提交和查看相关反馈