JSON_CONTAINS(Transact-SQL)

适用于: SQL Server 2025 (17.x) 预览版

在 JSON 文档中的路径中搜索 SQL 值。

注释

JSON_CONTAINS 函数目前为预览版,仅在 SQL Server 2025(17.x) 预览版中可用。

Transact-SQL 语法约定

语法

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 返回错误。

返回值

返回一个 int01NULL。 指定搜索值包含在目标 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