MySQL JSON_OVERLAPS() 函数使用指南

MySQL JSON_OVERLAPS() 函数检测两个 JSON 文档是否拥有任何一个相同键值对或数组元素。

JSON_OVERLAPS() 语法

这里是 MySQL JSON_OVERLAPS() 的语法:

JSON_OVERLAPS(json1, json2)

参数

json1
必需的。一个 JSON 文档。
json2
必需的。另一个 JSON 文档。

返回值

JSON_OVERLAPS() 函数检测两个 JSON 文档是否拥有任何一个相同键值对或数组元素。如果两个 JSON 文档有重叠的内容,JSON_OVERLAPS() 函数返回 1,否则返回 0

JSON_OVERLAPS() 函数按照如下规则比较两个 JSON 文档:

  • 比较两个数组时,如果两个数组至少有一个相同的元素返回 1,否则返回 0
  • 比较两个对象时,如果两个对象至少有一个相同的键值对返回 1,否则返回 0
  • 比较两个纯值时,如果两个值相同返回 1,否则返回 0
  • 比较纯值和数组时,如果值是这个数组中的直接元素返回 1,否则返回 0
  • 比较纯值和对象的结果为 0
  • 比较数组和对象的结果为 0
  • JSON_OVERLAPS() 不会对参数的数据类型进行转换。

如果参数为 NULL,此函数将返回 NULL

如果任意一个参数不是有效的 JSON 文档,MySQL 将会给出错误。您可以使用 JSON_VALID() 验证 JSON 文档的有效性。

JSON_OVERLAPS() 示例

这里列出了几个常见的 JSON_OVERLAPS() 用法示例。

比较数组

SELECT JSON_OVERLAPS('[1, 2, 3]', '[3, 4, 5]');
+-----------------------------------------+
| JSON_OVERLAPS('[1, 2, 3]', '[3, 4, 5]') |
+-----------------------------------------+
|                                       1 |
+-----------------------------------------+

这里,由于两个数组都有共同的元素 3,因此 JSON_OVERLAPS() 返回了 1。也就是说 [1, 2, 3][3, 4, 5] 有重叠。

让我们再看一个例子:

SELECT JSON_OVERLAPS('[1, 2, [3]]', '[3, 4, 5]');
+-------------------------------------------+
| JSON_OVERLAPS('[1, 2, [3]]', '[3, 4, 5]') |
+-------------------------------------------+
|                                         0 |
+-------------------------------------------+

这里,由于 [1, 2, [3]] 中的元素 [3][3, 4, 5] 中的 3 是不同的,因此 JSON_OVERLAPS() 返回了 0。也就是说 [1, 2, [3]][3, 4, 5] 没有交集。

比较对象

SELECT
    JSON_OVERLAPS('{"x": 1}', '{"x": 1, "y": 2}'),
    JSON_OVERLAPS('{"x": 1}', '{"y": 2}');
+-----------------------------------------------+---------------------------------------+
| JSON_OVERLAPS('{"x": 1}', '{"x": 1, "y": 2}') | JSON_OVERLAPS('{"x": 1}', '{"y": 2}') |
+-----------------------------------------------+---------------------------------------+
|                                             1 |                                     0 |
+-----------------------------------------------+---------------------------------------+

这里, {"x": 1}{"x": 1, "y": 2} 都有共同的键值对 "x": 1,因此 JSON_OVERLAPS() 返回了 1。 而 {"x": 1}{"y": 2} 没有共同的键值对,因此 JSON_OVERLAPS() 返回了 0

比较纯值和数组

SELECT
    JSON_OVERLAPS('[1, 2, 3]', '3'),
    JSON_OVERLAPS('[1, 2, [3]]', '3');
+---------------------------------+-----------------------------------+
| JSON_OVERLAPS('[1, 2, 3]', '3') | JSON_OVERLAPS('[1, 2, [3]]', '3') |
+---------------------------------+-----------------------------------+
|                               1 |                                 0 |
+---------------------------------+-----------------------------------+

这里,3[1, 2, 3] 的元素,而不是 [1, 2, [3]] 的元素,因此他们返回了不同的结果。

比较纯值

SELECT JSON_OVERLAPS('1', '1'), JSON_OVERLAPS('1', '"1"');
+-------------------------+---------------------------+
| JSON_OVERLAPS('1', '1') | JSON_OVERLAPS('1', '"1"') |
+-------------------------+---------------------------+
|                       1 |                         0 |
+-------------------------+---------------------------+

这里,由于 1"1" 是不同类型的数据,因此 JSON_OVERLAPS() 返回了 0