返回顶部
首页 > 资讯 > 数据库 >MySQL 判断 JSON 数组是否包含某元素
  • 913
分享到

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

GORMMySQLJSON数组 2023-09-14 17:09:04 913人浏览 独家记忆
摘要

文章目录 1.问题描述2.使用 JSON_CONTAINS 函数3.使用 gorm.io/datatypes4.JSON 数组包含多个元素的任意一个参考文献 1.问题描述 在 Mysql

文章目录

1.问题描述

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

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

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

2.使用 JSON_CONTaiNS 函数

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 官网的介绍。

3.使用 gorm.io/datatypes

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

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

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

4.JSON 数组包含多个元素的任意一个

如果给定多个元素,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

您可能感兴趣的文档:

--结束END--

本文标题: MySQL 判断 JSON 数组是否包含某元素

本文链接: https://www.lsjlt.com/news/407599.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作