JSON_QUERY (Transact-SQL)
适用于:SQL Server 2016 (13.x) 及更高版本 Azure SQL 数据库 Azure SQL 托管实例 Azure Synapse Analytics Microsoft Fabric 中的 SQL 分析终结点 Microsoft Fabric 中的仓库
从 JSON 字符串中提取对象或数组。
若要从 JSON 字符串提取标量值而不是对象或数组,请参阅 JSON_VALUE (Transact-SQL)。 有关 JSON_VALUE 和 JSON_QUERY
之间差异的信息,请参阅比较 JSON_VALUE 和 JSON_QUERY。
语法
JSON_QUERY ( expression [ , path ] )
参数
expression
一个表达式。 通常是包含 JSON 文本的变量或列的名称。
如果 JSON_QUERY
在找到由 path 标识的值之前,找到在 expression 中无效的 JSON,则函数会返回错误。 如果 JSON_QUERY
找不到由 path 标识的值,则它会扫描整个文本,并且会在找到在 expression 中任何位置无效的 JSON 时返回错误。
path
指定要提取的对象或数组的 JSON 路径。
在 SQL Server 2017 (14.x) 和 Azure SQL 数据库 中,可提供变量作为 path 的值。
JSON 路径可以为分析指定宽松或严格模式。 如果未指定分析模式,则宽松模式是默认值。 有关详细信息,请参阅 JSON 路径表达式 (SQL Server)。
路径的默认值为 $
. 因此,如果没有为 path 提供值,则 JSON_QUERY
会返回输入 expression。
如果 path 格式无效,则 JSON_QUERY
返回错误。
返回值
返回类型为 nvarchar(max) 的 JSON 片段。 返回值的排序规则与输入表达式的排序规则相同。
如果值不是对象或数组:
在宽松模式下,
JSON_QUERY
返回 NULL。在严格模式下,
JSON_QUERY
返回错误。
注解
宽松模式和严格模式
请参考以下 JSON 文本:
{
"info": {
"type": 1,
"address": {
"town": "Cheltenham",
"county": "Gloucestershire",
"country": "England"
},
"tags": ["Sport", "Water polo"]
},
"type": "Basic"
}
下表对宽松模式和严格模式下 JSON_QUERY
的行为进行了比较。 有关可选路径模式规范(宽松或严格)的详细信息,请参阅 JSON 路径表达式 (SQL Server)。
路径 | 宽松模式下的返回值 | 严格模式下的返回值 | 更多信息 |
---|---|---|---|
$ |
返回整个 JSON 文本。 | 返回整个 JSON 文本。 | 不适用 |
$.info.type |
NULL |
错误 | 不是对象或数组。 请改用 JSON_VALUE 。 |
$.info.address.town |
NULL |
错误 | 不是对象或数组。 请改用 JSON_VALUE 。 |
$.info."address" |
N'{ "town":"Cheltenham", "county":"Gloucestershire", "country":"England" }' |
N'{ "town":"Cheltenham", "county":"Gloucestershire", "country":"England" }' |
不适用 |
$.info.tags |
N'[ "Sport", "Water polo"]' |
N'[ "Sport", "Water polo"]' |
不适用 |
$.info.type[0] |
NULL |
错误 | 不是数组。 |
$.info.none |
NULL |
错误 | 属性不存在。 |
将 JSON_QUERY 与 FOR JSON 结合使用
JSON_QUERY
返回有效 JSON 片段。 因此,FOR JSON 不对 JSON_QUERY
返回值中的特殊字符进行转义。
如果在使用 FOR JSON 返回结果,并且包含已采用 JSON 格式(在列中或作为表达式的结果)的数据,则使用不带 path 参数的 JSON_QUERY
对数据进行包装。
示例
示例 1
下面的示例演示如何在查询结果中从 CustomFields
列返回 JSON 片段。
SELECT PersonID,FullName,
JSON_QUERY(CustomFields,'$.OtherLanguages') AS Languages
FROM Application.People
示例 2
下面的示例演示如何在 FOR JSON 子句的输出中包含 JSON 片段。
SELECT StockItemID, StockItemName,
JSON_QUERY(Tags) as Tags,
JSON_QUERY(CONCAT('["',ValidFrom,'","',ValidTo,'"]')) ValidityPeriod
FROM Warehouse.StockItems
FOR JSON PATH