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

 更新时间:2024年09月11日 09:20:56   作者:正常人谁写代码啊  
本文中介绍了如何通过SQL语句查询JSON字段中的特定数据,如查询数组中的元素,提取映射中的值,以及使用不同的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"}

85139ddd3d1542a9872f203a861a1dd5.png

 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')

查询结果

cb7aa08af0d349f0b97519feff32ff03.png

 为了避免重复代码冗余,后续的查询直接写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字段值内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MySQL中使用SQL语句查看某个表的编码方法

    MySQL中使用SQL语句查看某个表的编码方法

    下面小编就为大家带来一篇MySQL中使用SQL语句查看某个表的编码方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-11-11
  • 如何在Windows中运行多个MySQL实例详解

    如何在Windows中运行多个MySQL实例详解

    这篇文章主要给大家介绍了关于如何在Windows中运行多个MySQL实例的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用MySQL具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-09-09
  • MySQL性能优化神器Explain的基本使用分析

    MySQL性能优化神器Explain的基本使用分析

    这篇文章主要给大家介绍了关于MySQL性能优化神器Explain的基本使用分析,文中通过示例代码介绍的非常详细,对大家学习或者使用MySQL具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-08-08
  • centos编译安装mysql 5.6及安装多个mysql实例详解

    centos编译安装mysql 5.6及安装多个mysql实例详解

    这篇文章主要介绍了centos编译安装mysql 5.6及安装多个mysql实例详解,需要的朋友可以参考下
    2017-02-02
  • SQL基础的查询语句

    SQL基础的查询语句

    这篇文章主要给大家分享的是SQL基础的查询语句,SQL语句中,查询是使用最多的操作,SQL不仅能够查询表中的数据,还可以返回算术运算、表达式的结果等,接下来就一起了解一下基本的查询语句,需要的朋友可以参考一下
    2021-11-11
  • insert into … on duplicate key update / replace into 多行数据介绍

    insert into … on duplicate key update / replace into 多行数据介绍

    当我插入一条数据时,我要判断(k1,k2)是否已经存在(1条selete),若存在就update,不存在就insert
    2013-08-08
  • Mysql SSH隧道连接使用的基本步骤

    Mysql SSH隧道连接使用的基本步骤

    这篇文章主要给大家介绍了关于Mysql SSH隧道连接使用的基本步骤,文中通过示例代码介绍的非常详细,对大家学习或者使用Mysql具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-05-05
  • MySQL入门教程(七)之视图

    MySQL入门教程(七)之视图

    视图是从一个或多个表中导出来的虚拟表。视图就像一个窗口,通过这个窗口可以看到系统专门提供的数据。本文给大家介绍MySQL入门教程(七)之视图,需要的朋友参考下
    2016-04-04
  • 史上最简单的MySQL数据备份与还原教程(中)(三十六)

    史上最简单的MySQL数据备份与还原教程(中)(三十六)

    这篇文章主要为大家详细介绍了史上最简单的MySQL数据备份与还原教程中篇,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-10-10
  • mysql表的清空、删除和修改操作详解

    mysql表的清空、删除和修改操作详解

    这篇文章主要详细介绍了mysql表的清空、删除和修改操作的方法,以及一些常用的mysql的常用操作,非常的简单实用,有需要的可以参考下
    2014-09-09

最新评论