首页 > 解决方案 > 有没有办法检查一个 json 数组是否至少包含 MySQL 中另一个 json 数组的一项?

问题描述

我在我的 MySQL db json 字段中存储了一些 json 数组。
例如:["Python", "C", "C++", "C#", "R"]

我的数据库的一个例子:

    |  name  |      techs       |
    |--------|------------------|
    | victor | ["Python", "R"]  |
    | anne   | ["C#", "Python"] |

我需要搜索 json 数组至少包含另一个 json 数组的一项的行。问题出在我正在执行的查询中:

   select name from devs  
   where json_contains('techs', '["Python"]')

这实际上工作正常并返回数组包含“Python”的所有行(在本例中为 [Victor, Anne]),但是当我尝试传递任何数组中不存在的项目时:

   select * from devs  
   where json_contains('techs', '["Python", "Java"]')

这并没有返回任何内容,因为没有包含“Python”和“Java”的数组。也许,我想在他们的 json 数组上接收所有带有“Python”或“Java”的行。

这样,是否有语法以我想要的方式返回数据?
提前致谢。

有用信息:MySQL:v8.0,在 Windows 10 上运行。

标签: mysqlsqlarraysjsondatabase

解决方案


MySQL 8.0 具有功能JSON_OVERLAPS(),它完全符合您的要求:

比较两个 JSON 文档。如果两个文档有任何共同的键值对或数组元素,则返回 true (1)。

当两个比较两个数组时,如果它们共享一个或多个数组元素, JSON_OVERLAPS() 返回 true,否则返回 false。

您可以在自联接查询中使用它,例如:

select t.*
from mytable t
inner join mytable t1 on json_overlaps(t1.techs, t2.techs)

推荐阅读