适用于: SQL Server 2025 (17.x) 预览版
在 JSON 文档中的路径中搜索 SQL 值。
注释
该 JSON_CONTAINS
函数目前为预览版,仅在 SQL Server 2025(17.x) 预览版中可用。
语法
JSON_CONTAINS( target_expression , search_value_expression [ , path_expression ] )
论据
target_expression
返回要搜索的目标 JSON 文档的表达式。 该值可以是包含 JSON 文档的 json 类型或字符串值。
搜索值表达式
一个表达式,返回要在指定的 SQL/JSON 文档中搜索的 SQL 标量值或 json 类型值。
路径
一个 SQL/JSON 路径,指定 JSON 文档中的搜索目标。 此参数是可选的。
可以将变量作为 路径的值提供。 JSON 路径可以为分析指定宽松或严格模式。 如果未指定分析模式,则宽松模式是默认值。 有关详细信息,请参阅 JSON 路径表达式 (SQL Server)。
路径的默认值为 $
. 因此,如果未提供 路径值,请 JSON_CONTAINS
搜索整个 JSON 文档中的值。
如果 path 格式无效,则 JSON_CONTAINS
返回错误。
返回值
返回一个 int 值 0
, 1
或 NULL
。 指定搜索值包含在目标 JSON 文档中时其值为1
,否则为0
。 如果任一参数为NULL
,或在 JSON 文档中未找到指定的 SQL/JSON 路径,该JSON_CONTAINS
函数将返回NULL
。
注解
该 JSON_CONTAINS
函数遵循以下规则来搜索 JSON 文档中是否包含值:
标量搜索值包含在目标标量中,前提是它们可比较且相等。 由于 json 类型只有 JSON 数字或字符串或 true/false 值,因此可以指定为搜索值的可能 SQL 标量类型仅限于 SQL 数值类型、字符字符串类型和 位 类型。
标量搜索值的 SQL 类型用于与指定路径中的 json 类型值进行比较。 这不同于基于
JSON_VALUE
的谓词,其中JSON_VALUE
函数始终返回字符串值。仅当搜索数组中的每个元素都包含在目标数组的某些元素中时,JSON 数组搜索值才会包含在目标数组中。
仅当搜索值包含在目标数组的某些元素中时,标量搜索值才会包含在目标数组中。
只有当在目标对象中找到搜索对象中的每个键/值时,JSON 对象搜索值才算包含在目标对象中。
局限性
使用函数 JSON_CONTAINS
具有以下限制:
- json 类型不支持作为搜索值。
- 不支持从中
JSON_QUERY
返回的 JSON 对象或数组作为搜索值。 - 路径参数当前是必需的。
- 如果 SQL/JSON 路径指向数组,则需要在 SQL/JSON 路径表达式中使用通配符。 自动数组解包目前仅在第一级别。
JSON 索引支持包括 JSON_CONTAINS
谓词和以下运算符:
- 比较运算符 (
=
) -
IS [NOT] NULL
谓词(当前不支持)
例子
答: 在 JSON 路径中搜索 SQL 整数值
以下示例演示如何在 JSON 路径的 JSON 数组中搜索 SQL int 值。
DECLARE @j AS JSON = '{"a": 1, "b": 2, "c": {"d": 4, "ce":["dd"]}, "d": [1, 3, {"df": [89]}, false], "e":null, "f":true}';
SELECT json_contains(@j, 1, '$.a') AS is_value_found;
结果集如下。
is_value_found
--------
1
B. 在 JSON 路径中搜索 SQL 字符串值
以下示例演示如何在 JSON 路径的 JSON 数组中搜索 SQL 字符串值。
DECLARE @j AS JSON = '{"a": 1, "b": 2, "c": {"d": 4, "ce":["dd"]}, "d": [1, 3, {"df": [89]}, false], "e":null, "f":true}';
SELECT json_contains(@j, 'dd', '$.c.ce[*]') AS is_value_found;
结果集如下。
is_value_found
--------
1
C. 在 JSON 路径的 JSON 数组中搜索 SQL 位值
以下示例演示如何在 JSON 路径的 JSON 数组中搜索 SQL 位值。
DECLARE @j AS JSON = '{"a": 1, "b": 2, "c": {"d": 4, "ce":["dd"]}, "d": [1, 3, {"df": [89]}, false], "e":null, "f":true}';
SELECT json_contains(@j, CAST (0 AS BIT), '$.d[*]') AS is_value_found;
结果集如下。
is_value_found
--------
1
D. 搜索嵌套 JSON 数组中包含的 SQL 整数值
以下示例演示如何搜索 JSON 路径中嵌套 JSON 数组中包含的 SQL int 值。
DECLARE @j AS JSON = '{"a": 1, "b": 2, "c": {"d": 4, "ce":["dd"]}, "d": [1, 3, {"df": [89]}, false], "e":null, "f":true}';
SELECT json_contains(@j, 89, '$.d[*].df[*]') AS is_value_found;
结果集如下。
is_value_found
--------
1
E. 搜索 JSON 数组中 JSON 对象中包含的 SQL 整数值
以下示例演示如何在 JSON 路径的 JSON 数组中搜索 JSON 对象中包含的 SQL int 值。
DECLARE @j AS JSON = '[{"a": 1}, {"b": 2}, {"c": 3}, {"a": 56}]';
SELECT json_contains(@j, 56, '$[*].a') AS is_value_found;
结果集如下。
is_value_found
--------
1