JSON 路径表达式 (SQL Server)
适用范围:SQL Server 2016 (13.x) 及更高版本 Azure SQL 数据库 Azure SQL 托管实例 Azure Synapse Analytics(仅限无服务器 SQL 池)
使用 JSON 路径表达式可引用 JSON 对象的属性。
在调用以下函数时,必须提供路径表达式。
调用 OPENJSON 以创建 JSON 数据的关系视图时。 有关详细信息,请参阅 OPENJSON (Transact-SQL)。
调用 JSON_VALUE 以从 JSON 文本中提取值。 有关详细信息,请参阅 JSON_VALUE (Transact-SQL)。
调用 JSON_QUERY 以提取 JSON 对象或数组时。 有关详细信息,请参阅 JSON_QUERY (Transact-SQL)。
调用 JSON_MODIFY 以更新 JSON 字符串的属性值时。 有关详细信息,请参阅 JSON_MODIFY (Transact-SQL)。
路径表达式的各部分
路径表达式由两部分组成。
路径模式
在路径表达式的开头,可以选择指定关键字 lax 或 strict来声明路径模式。 默认值为 lax。
在 lax 模式下,如果路径表达式包含错误,函数将返回空值。 例如,如果请求值 $.name,但 JSON 文本不包含 name 键,函数将返回 null,但不会引发错误。
在 strict 模式下,如果路径表达式包含错误,函数将引发错误。
以下查询显式指定路径表达式中的 lax
模式。
DECLARE @json NVARCHAR(MAX);
SET @json=N'{ ... }';
SELECT * FROM OPENJSON(@json, N'lax $.info');
路径
在声明可选的路径模式后,请指定路径本身。
美元符号 (
$
) 表示上下文项。属性路径是一组路径步幅。 路径步幅可以包含下列元素和运算符。
键名。 例如,
$.name
和$."first name"
。 如果键名以美元符号开头或者包含空格或点运算符 (.
) 等特殊字符,请为其加上引号。数组元素。 例如,
$.product[3]
。 数组从零开始。点运算符 (
.
) 指示对象的成员。 例如,在$.people[1].surname
中,surname
是people
的子级。
示例
本部分中的示例引用以下 JSON 文本。
{
"people": [{
"name": "John",
"surname": "Doe"
}, {
"name": "Jane",
"surname": null,
"active": true
}]
}
下表显示了一些路径表达式示例。
路径表达式 | 值 |
---|---|
$.people[0].name | John |
$.people[1] | { "name": "Jane", "surname": null, "active": true } |
$.people[1].surname | Null |
$ | { "people": [ { "name": "John", "surname": "Doe" }, { "name": "Jane", "surname": null, "active": true } ] } |
内置函数如何处理重复的路径
如果 JSON 文本包含重复属性,例如,同一级别上有两个同名的键,JSON_VALUE 和 JSON_QUERY 函数将仅返回第一个与路径匹配的值。 若要分析包含重复键的 JSON 对象并返回所有值,请使用 OPENJSON,如下面的示例中所示。
DECLARE @json NVARCHAR(MAX);
SET @json=N'{"person":{"info":{"name":"John", "name":"Jack"}}}';
SELECT value
FROM OPENJSON(@json,'$.person.info');
详细了解 SQL Server 和 Azure SQL 数据库中的 JSON
Microsoft 视频
注意
此部分中的某些视频链接在此时可能不起作用。 Microsoft 会将以前在第 9 频道上的内容迁移到新平台。 随着视频迁移到新平台,我们将更新链接。
有关 SQL Server 和 Azure SQL 数据库中内置 JSON 支持的视频介绍,请观看以下视频:
另请参阅
OPENJSON (Transact-SQL)
JSON_VALUE (Transact-SQL)
JSON_QUERY (Transact-SQL)