文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

MySQL 判断 JSON 数组是否包含某元素

2023-09-14 17:49

关注

文章目录

在 MySQL 中,并没有内置的数组数据类型。但是,MySQL 提供了一些可以实现类似数组功能的机制,如使用字符串来存储由逗号分隔的值,或使用 JSON 类型来存储数组数据等。

假设您正在使用 GORM 和 MySQL 数据库,并且您的数据表中有一个名为 data 的 JSON 类型的列,其中存储了一个字符串数组,您想要查询该数组是否包含某个元素。

import ("gorm.io/datatypes")type MyModel struct {    ID   uint    Data datatypes.JSON `gorm:"column:data"`}

MySQL JSON_CONTAINS 函数可用于判断 JSON 数组中是否包含某个元素。

JSON_CONTAINS 的格式如下:

JSON_CONTAINS(target, candidate[, path])

target 要搜索的 JSON 数据。

candidate 要查找的 JSON 值或对象。

path (可选) 指定一个 JSON 路径表达式,用于在目标 JSON 数据中定位要搜索的子对象。

包含返回 1, 不包含返回 0。如果任何参数为 NULL,或 path 参数没有标识目标文档的部分,则返回 NULL。如果 target 或 candidate 不是有效的 JSON 文档,或者 path 不是有效的路径表达式或包含***通配符,则发生错误。

我们可以使用原生 SQL 作为 GORM 的内联条件来判断 JSON 数组中是否包含某值。

var rows []MyModelDB.Where(fmt.Sprintf(`JSON_CONTAINS(data,'"%v"')`, YOUR_STR_VALUE)).Find(&rows)

因为 JSON 字符串数组中的元素是被双引号包裹的,所以指定字符串时,需要指定双引号。此时 SQL 字符串包含双引号,可以使用单引号表示包含双引号的字符串。

如果需要指定多个值,可以使用 JSON_ARRAY 函数将多个值创建为 JSON 数组。

如果指定多个值,表示要同时包含多个值条件才为 true。

DB.Where(fmt.Sprintf(`JSON_CONTAINS(data, JSON_ARRAY("%v")`, YOUR_STR_VALUE)).Find(&rows)

JSON_CONTAINS 函数还可以判断 JSON 对象中某个字段的值是否为指定的值,具体用法可参见 MySQL 官网的介绍。

gorm.io/datatypes 是 GORM v2 版本中引入的一个包,提供了一些数据库特定的数据类型,例如 JSON、HSTORE、ARRAY、UUID 等。

datatypes 支持对 JSON 数组的包含查询。

var rows []MyModelDB.Where(datatypes.JSONArrayQuery("data").Contains("YOUR_STR_VALUE")).Find(&rows)

如果给定多个元素,JSON 数组中只要包含其中任意一个元素,则认为是 true,该如何实现呢?

MySQL 5.7 和 8.0 均未包含一个类似 JSON_CONTAINS 的函数 JSON_CONTAINS_ANY 来实现我们想要的效果。

在 MySQL 5.7 中,我们可以使用 OR 运算符实现。

SELECT * FROM   table_nameWHERE  JSON_CONTAINS(json_array_column, value1) OR JSON_CONTAINS(json_array_column, value2)

如果使用 gorm.io/datatypes 实现的话,类似于下面的实现。

db := DB.Model(&MyModel{})for i, v := range values{if i == 0 {db.Where(datatypes.JSONArrayQuery("json_array_column").Contains(v))} else {db.Or(datatypes.JSONArrayQuery("json_array_column").Contains(v))}}

从 MySQL 8.0 开始,可以使用 JSON_OVERLAPS 函数。

SELECT * FROM   table_nameWHERE  JSON_OVERLAPS(json_array_column, JSON_ARRAY(val[, val] ...]))

OpenAI ChatGPT
12.18.3 Functions That Search JSON Values
mysql,查询json数组字段中包含某个元素的sql语句 - CSDN博客
MySQL Filter JSON_CONTAINS Any value from Array - stackoverflow.com

来源地址:https://blog.csdn.net/K346K346/article/details/128863722

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-数据库
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯