Mysql中JSON字段的值的实现示例
我们在查询mysql数据时,查询某个字段的数剧是我们经常接触的,直接使用sql语句或者更方便的直接使用数据库的orm语句查询。但是如果需要查询某个json字段里面的某些数据,orm模型可能都无法达到效果,还不如直接使用sql语句进行查询来的直观。下面总结了一些sql语句查询json字段里面的值。
mysql版本是5.7,使用fastapi和tortoise-orm接口的方式返回查询到的响应结果。
下面创建了一个用于测试的数据表。包括主键id,varchar类型的name,json类型的code(数组)和info(映射)。
例如:code数据结构:["A1b2C3d4E5", "F6g7H8i9J0", "K1l2M3n4O5", "P6q7R8s9T0", "U1v2W3x4Y5", "Z6a7B8c9D0", "E1F2g3H4i5", "J6k7L8m9N0", "O1P2q3R4s5", "T6U7v8W9x0", "Y1Z2a3B4c5", "D6E7F8g9H0", "I1j2K3l4M5", "N6O7P8q9R0", "S1T2U3v4W5", "X6Y7Z8a9B0"]
info数据结构:{"age": 30, "city": "New York", "name": "Alice", "contact": {"email": "alice@example.com", "phone": "123-456-7890"}, "education": "Bachelor"}
1、查询info中age=30的数据
@router.get('/jsontest/{keyword}/{value}', description="获取mysql的json值测试")
async def search_(keyword: str, value: str):
query = f"SELECT * FROM jsontest WHERE JSON_CONTAINS(info->'$.{keyword}','{value}')"
conn = tortoise.Tortoise.get_connection("default")
try:
_, index_result = await conn.execute_query(query)
except Exception as ex:
error_msg = f"error:{ex.__class__.__name__}-{str(ex)}"
log_it(error_msg, level=logging.ERROR)
return JSONResponse(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, content=error_msg)
finally:
await conn.close()
return JSONResponse(
status_code=status.HTTP_200_OK,
content=index_result
)
SELECT * FROM jsontest WHERE JSON_CONTAINS(info->'$.age','30')
查询结果
为了避免重复代码冗余,后续的查询直接写sql语句了。可以通过更改api接口传参,构造query语句达到一样的效果。
2、查询code数组中包含"ANOPQRSTU8"的数据
SELECT * FROM jsontest WHERE JSON_CONTAINS(code,'"ANOPQRSTU8"')
3、查询info中city是New York并且code中包含AWXYZ01239的数据
SELECT * FROM jsontest WHERE JSON_CONTAINS(info->'$.city','"New York"') AND JSON_CONTAINS(code,'"AWXYZ01239"')
4、查询info中包含city和age的数据,指定的是"one"表示只需包含任何一个路径即可,"all"表示需要包含所有指定路径
SELECT * FROM jsontest WHERE JSON_CONTAINS_PATH(info, 'one', '$.city', '$.age');
SELECT * FROM jsontest WHERE JSON_CONTAINS_PATH(info, 'all', '$.city', '$.contact.email');
5、查询Alice info数据中的city,age,以及contact里面的email。下面两种效果是一样的,只不过使用JSON_EXTRACT返回的是一个字段,而->这种方法返回的是拆分开的字段
SELECT JSON_EXTRACT(info, '$.city','$.age','$.contact.email') AS name FROM jsontest WHERE name = 'Alice';
SELECT info->'$.city',info->'$.age',info->'$.contact.email' FROM jsontest WHERE name = 'Alice'
6、查询Alice code数组中前三个数据。数组类型的json只能通过索引获取值,如果想获取全部则改成'$[*]'即可。下面两种效果是一样的,只不过使用JSON_EXTRACT返回的是一个字段,而->这种方法返回的是拆分开的字段
SELECT JSON_EXTRACT(code, '$[0]','$[1]','$[2]') AS res FROM jsontest WHERE name = 'Alice';
SELECT code->'$[0]',code->'$[1]',code->'$[2]' FROM jsontest WHERE name = 'Alice';
# 获取数组里面的所有数据
SELECT JSON_EXTRACT(code, '$[*]') AS res FROM jsontest WHERE name = 'Alice';
SELECT code->'$[*]' FROM jsontest WHERE name = 'Alice';
7、使用JSON_UNQUOTE去除 JSON 字符串的引号。上面返回的数据带有原始json的引号,这一点有时对结果处理特别不友好,可以使用JSON_UNQUOTE进行处理
SELECT JSON_UNQUOTE(JSON_EXTRACT(info, '$.contact.email')) AS email FROM jsontest WHERE name = 'Alice';
8、提取info映射里面的所有key,也可以查询嵌套字典里面的所有key
SELECT JSON_KEYS(info) AS k FROM jsontest WHERE name = 'Alice';
#查询嵌套字典的key
SELECT JSON_KEYS(info->'$.contact') AS k FROM jsontest WHERE name = 'Alice';
9、获取code数组和字典info的长度
SELECT JSON_LENGTH(code, '$') as count FROM jsontest WHERE name = 'Alice'
SELECT JSON_LENGTH(info, '$') as count FROM jsontest WHERE name = 'Alice'
# 获取嵌套字典的长度
SELECT JSON_LENGTH(info->'$.contact') as count FROM jsontest WHERE name = 'Alice'
10、搜索数组和字典里面的值
# 搜索字典中的value,one_or_all: 指定搜索所有匹配项还是仅找到的第一个匹配项
SELECT JSON_SEARCH(info, 'all', "New York") AS search_result FROM jsontest
# 搜索数组中的值,%A%模糊搜索含有A的数据
SELECT JSON_SEARCH(code, 'all', '%A%') AS search_result FROM jsontest
到此这篇关于Mysql中JSON字段的值的实现示例的文章就介绍到这了,更多相关Mysql JSON字段值内容请搜索编程客栈(www.lsjlt.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网(www.lsjlt.com)!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
Mysql中JSON字段的值的实现示例
下载Word文档到电脑,方便收藏和打印~
相关文章
- 如何在 Java 分布式架构中避免错误?(Java分布式架构如何避免错误)
- 如何利用 Java 多线程来进行数据统计?(怎么用java多线程统计数据)
- 掌握Ruby加密与解密:确保数据安全的关键步骤
- 在 Java 中,try 语句的具体使用方法究竟是什么?(java中try的使用方法是什么)
- 如何在 Linux 系统中监控 Java 线程池?(linux怎么监控java线程池)
- 如何利用 Java 中的 random 函数达成随机排序?(怎样使用java中random函数实现随机排序)
- 在 IDEA 中如何使用 Java 语言连接 MySQL 并实现增、删、查操作?(IDEA中使用Java语言连接MySQL实现增、删、查操作)
- 如何在 Java 中正确使用 Thread.join()?(Java中Thread.join()的使用方法)
- Java 中 Spock 框架的社区支持与资源相关疑问解答(Java中Spock框架的社区支持和资源)
- 如何利用 JavaScript 来辨别浏览器?(怎么使用javascript识别浏览器)
猜你喜欢
Mysql中JSON字段的值的实现示例
MySQL中字段的实际长度的实现示例代码
MySQL中查询json格式的字段实例详解
mysql中json类型字段的基本用法实例
mysql 字段括号拼接的实现示例
sql怎么取json中的字段值
sql如何取json中的字段值
MySQL多个字段拼接去重的实现示例
MySQL插入时间戳字段的值实现
MySQL中使用JSON存储数据的实现示例
MySQL中json字段的操作方法
sql如何获取json串中字段的值
sql如何获取json串中字段的值
MybatisPlus字段类型转换的实现示例
MYSQL实现将B表中的字段值到更新A表中
mysql中取出json字段的小技巧
编程热搜
[mysql]mysql8修改root密码
use mysqlselect * from user where user="root";update user set password=password("mysql@2020") where user="root";ERROR 1064 (42000)MySQL专题3之MySQL管理
1、启动以及关闭MySQL服务器- 首先,我们需要通过以下命令来检查MySQL服务器是否已经启动:ps -ef | grep mysqld- 如果MySQL已经启动,以上命令将输出mysql进程列表,如果mysql未启动,你可以使用以下
编程资源站
- 资料下载
- 历年试题
目录
反馈
我要
反馈