京东6.18大促主会场领京享红包更优惠

 找回密码
 立即注册

QQ登录

只需一步,快速开始

Mysql中JSON字段的值的实现示例

2024-11-2 22:38| 发布者: db4d5a85| 查看: 47| 评论: 0

摘要: 我们在查询mysql数据时,查询某个字段的数剧是我们常常打仗的,直接使用sql语句大概更方便的直接使用数据库的orm语句查询。但是假如需要查询某个json字段里面的某些数据,orm模子可能都无法到达效果,还不如直接使用

我们在查询mysql数据时,查询某个字段的数剧是我们常常打仗的,直接使用sql语句大概更方便的直接使用数据库的orm语句查询。但是假如需要查询某个json字段里面的某些数据,orm模子可能都无法到达效果,还不如直接使用sql语句进行查询来的直观。下面总结了一些sql语句查询json字段里面的值。

mysql版本是5.7,使用fastapi和tortoise-orm接口的方式返回查询到的响应效果。

下面创建了一个用于测试的数据表。包罗主键id,varchar类型的name,json类型的code(数组)和info(映射)。

[code]比方: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"}[/code]

85139ddd3d1542a9872f203a861a1dd5.png

 1、查询info中age=30的数据

[code]@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 )[/code] [code]SELECT * FROM jsontest WHERE JSON_CONTAINS(info->'$.age','30')[/code]

查询效果

cb7aa08af0d349f0b97519feff32ff03.png

 为了避免重复代码冗余,后续的查询直接写sql语句了。可以通过更改api接口传参,构造query语句到达一样的效果。

2、查询code数组中包罗"ANOPQRSTU8"的数据

[code]SELECT * FROM jsontest WHERE JSON_CONTAINS(code,'"ANOPQRSTU8"')[/code]

3、查询info中city是New York而且code中包罗AWXYZ01239的数据

[code]SELECT * FROM jsontest WHERE JSON_CONTAINS(info->'$.city','"New York"') AND JSON_CONTAINS(code,'"AWXYZ01239"')[/code]

4、查询info中包罗city和age的数据,指定的是"one"体现只需包罗任何一个路径即可,"all"体现需要包罗全部指定路径

[code]SELECT * FROM jsontest WHERE JSON_CONTAINS_PATH(info, 'one', '$.city', '$.age'); SELECT * FROM jsontest WHERE JSON_CONTAINS_PATH(info, 'all', '$.city', '$.contact.email');[/code]

5、查询Alice info数据中的city,age,以及contact里面的email。下面两种效果是一样的,只不外使用JSON_EXTRACT返回的是一个字段,而->这种方法返回的是拆分开的字段

[code]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'[/code]

6、查询Alice code数组中前三个数据。数组类型的json只能通过索引获取值,假如想获取全部则改成'$[*]'即可。下面两种效果是一样的,只不外使用JSON_EXTRACT返回的是一个字段,而->这种方法返回的是拆分开的字段

[code]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'; [/code]

7、使用JSON_UNQUOTE去除 JSON 字符串的引号。上面返回的数据带有原始json的引号,这一点有时对效果处置惩罚特殊不友好,可以使用JSON_UNQUOTE进行处置惩罚

[code]SELECT JSON_UNQUOTE(JSON_EXTRACT(info, '$.contact.email')) AS email FROM jsontest WHERE name = 'Alice';[/code]

8、提取info映射里面的全部key,也可以查询嵌套字典里面的全部key

[code]SELECT JSON_KEYS(info) AS k FROM jsontest WHERE name = 'Alice'; #查询嵌套字典的key SELECT JSON_KEYS(info->'$.contact') AS k FROM jsontest WHERE name = 'Alice';[/code]

9、获取code数组和字典info的长度

[code]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'[/code]

10、搜索数组和字典里面的值

[code]# 搜索字典中的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[/code]

到此这篇关于Mysql中JSON字段的值的实现示例的文章就先容到这了,更多相关Mysql JSON字段值内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望各人以后多多支持脚本之家!


来源:https://www.jb51.net/database/327217k38.htm
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
关闭

站长推荐上一条 /6 下一条

QQ|手机版|小黑屋|梦想之都-俊月星空 ( 粤ICP备18056059号 )|网站地图

GMT+8, 2025-7-2 03:16 , Processed in 0.054479 second(s), 18 queries .

Powered by Mxzdjyxk! X3.5

© 2001-2025 Discuz! Team.

返回顶部