JSON_CONTAINS(Transact-SQL)

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

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

Note

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

Transact-SQL 语法约定

Syntax

JSON_CONTAINS( target_expression , search_value_expression [ , path_expression ] )

Arguments

target_expression

返回要搜索的目标 JSON 文档的表达式。 该值可以是包含 JSON 文档的 json 类型或字符串值。

search_value_expression

一个表达式,返回要在指定的 SQL/JSON 文档中搜索的 SQL 标量值或 json 类型值。

path

一个 SQL/JSON 路径,指定 JSON 文档中的搜索目标。 此参数是可选的。

可以将变量作为 路径的值提供。 JSON 路径可以为分析指定宽松或严格模式。 如果未指定分析模式,则宽松模式是默认值。 有关详细信息,请参阅 JSON 路径表达式

路径的默认值为 $. 因此,如果未提供 路径值,请 JSON_CONTAINS 搜索整个 JSON 文档中的值。

如果 路径 的格式无效, JSON_CONTAINS 则返回错误。

返回值

返回一个 int01NULL。 指定搜索值包含在目标 JSON 文档中时其值为1,否则为0。 如果任一参数为JSON_CONTAINS,或在 JSON 文档中未找到指定的 SQL/JSON 路径,该NULL函数将返回NULL

Remarks

JSON_CONTAINS 函数遵循以下规则来搜索 JSON 文档中是否包含值:

  • 标量搜索值包含在目标标量中,前提是它们可比较且相等。 由于 json 类型只有 JSON 数字或字符串或 true/false 值,因此可以指定为搜索值的可能 SQL 标量类型仅限于 SQL 数值类型、字符字符串类型和 类型。

  • 标量搜索值的 SQL 类型用于与指定路径中的 json 类型值进行比较。 这不同于基于JSON_VALUE的谓词,其中JSON_VALUE函数始终返回字符串值。

  • 仅当搜索数组中的每个元素都包含在目标数组的某些元素中时,JSON 数组搜索值才会包含在目标数组中。

  • 仅当搜索值包含在目标数组的某些元素中时,标量搜索值才会包含在目标数组中。

  • 只有当在目标对象中找到搜索对象中的每个键/值时,JSON 对象搜索值才算包含在目标对象中。

Limitations

使用函数 JSON_CONTAINS 具有以下限制:

  • json 类型不支持作为搜索值。
  • 不支持从中 JSON_QUERY 返回的 JSON 对象或数组作为搜索值。
  • 路径参数当前是必需的。
  • 如果 SQL/JSON 路径指向数组,则需要在 SQL/JSON 路径表达式中使用通配符。 自动数组解包目前仅在第一级别。

JSON 索引支持包括 JSON_CONTAINS 谓词和以下运算符:

  • 比较运算符 (=
  • IS [NOT] NULL 谓词(当前不支持)

Examples

A. 在 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