mysql - 有没有办法检查一个 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 上运行。
解决方案
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)
推荐阅读
- android - Java-如何从另一个 AsyncTask 启动一个 AsyncTask
- python-3.x - wxPython,制作一个窗口模式
- phaser-framework - Phaser 3 - 如何创建平滑的缩放效果
- ruby-on-rails - 如何处理 Collection 缓存和 i18n?
- android - 如何最小化我们的活动并将其显示为浮动按钮?
- excel - 单击并将代码应用于Excel中的所有选项卡时如何突出显示行
- javascript - while ($row = mysqli_fetch_array($result)) + JAVASCRIPT 错误
- c++ - 使用 DeferWindowPos 更新 z 顺序?
- javascript - 首次加载时,Fullcalendar 不会使用自定义事件调整单元格的高度
- haxe - 如何仅从 Haxe 中的另一个类内部实例化类