跳到主要内容

JSON_CONTAINS

描述

该函数用于检验指定 JSON 文档是否包含在目标 JSON 文档中,或者是否在目标文档的指定路径上找到指定元素(如果提供了 path 参数)。如果指定 JSON 文档包含在目标 JSON 文档中,该函数返回 1,否则返回 0。

如果只需要检查指定路径中是否存在数据,请使用 JSON_CONTAINS_PATH() 代替。

语法

JSON_CONTAINS(target, candidate[, path])

说明

参数 candidate 用于指定 JSON 文档,参数 target 表示目标 JSON 文档。

如果任意参数为 NULL,或者 path 参数未被识别为目标文档的一部分,则返回 NULL

以下情况都会发生报错:

  • candidatetarget 参数不是有效的 JSON 文档。

  • path 参数不是有效的路径表达式。

  • path 参数包含 * 或 ** 通配符。

该函数遵循以下的规则:

  • 单个元素相等的前提是两个标量值的 JSON_TYPE() 相同,并且可以进行比较。如果是数值类型,可以直接进行比较。

  • 对于数组,当且仅当 candidate 数组的所有元素都包含在 target 数组中时,candidate 数组才包含在 target 数组中。

  • 对于对象,当且仅当 candidate 对象的所有 key 都需要包含在 target 对象中,而且每个 key 对应的 value 也要和目标对象对应的 key 相同时,candidate 对象才包含在 target 对象中。

示例

SET @jn = '{"a": 1, "b": 2, "c": {"d": 4}}';
Query OK, 0 rows affected (0.000 sec)

SET @jn2 = '1';
Query OK, 0 rows affected (0.000 sec)

SELECT JSON_CONTAINS(@jn, @jn2, '$.a');
+---------------------------------+
| JSON_CONTAINS(@jn, @jn2, '$.a') |
+---------------------------------+
| 1 |
+---------------------------------+
1 row in set (0.001 sec)

SELECT JSON_CONTAINS(@jn, @jn2, '$.b');
+---------------------------------+
| JSON_CONTAINS(@jn, @jn2, '$.b') |
+---------------------------------+
| 0 |
+---------------------------------+
1 row in set (0.001 sec)

SET @jn2 = '{"d": 4}';
Query OK, 0 rows affected (0.000 sec)

SELECT JSON_CONTAINS(@jn, @jn2, '$.a');
+---------------------------------+
| JSON_CONTAINS(@jn, @jn2, '$.a') |
+---------------------------------+
| 0 |
+---------------------------------+
1 row in set (0.001 sec)

SELECT JSON_CONTAINS(@jn, @jn2, '$.c');
+---------------------------------+
| JSON_CONTAINS(@jn, @jn2, '$.c') |
+---------------------------------+
| 1 |
+---------------------------------+
1 row in set (0.001 sec)