【问题标题】:Is there a way to check if an json array contains at least one item of another json array in MySQL?有没有办法检查一个 json 数组是否至少包含 MySQL 中另一个 json 数组的一项?
【发布时间】:2020-05-07 19:26:04
【问题描述】:

我在我的 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 上运行。

【问题讨论】:

  • 如果您以正常方式而不是 JSON 数组存储数据,这将是一个普通的 INNER JOIN。我还没有看到一个关于 MySQL 中 JSON 的问题,如果不使用 JSON 就不会更容易回答。
  • 你是对的,使用另一个表会更容易。但我真的很想尝试使用这种方法。如果我不能,我会使用另一张桌子。
  • 我实际上只是在玩 MySQL 数据类型,老实说,使用它并没有付出任何努力,但玩各种可能性实际上很有趣,别担心,我不会在任何项目中使用它:D

标签: mysql sql arrays json database


【解决方案1】:

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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-28
    • 1970-01-01
    • 2018-04-18
    相关资源
    最近更新 更多