搜索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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/587682.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

国产化改造之容器迁移指导(未完)

一、背景 信创即信息技术应用创新的简称,涵盖了国产软件、国产芯片以及云计算等各个方向,也可以理解为常说的“ZZKK(自主可控)”, ZZKK是指对国内企事业单位应用系统中关键软硬件部件的安全性、可靠性、性能稳定性、安全接入等方面进行评估和测试的过程。信创的发展核心就…

(四)小程序学习笔记——自定义组件

1、组件注册——usingComponents (1)全局注册:在app.json文件中配置 usingComponents进行注册,注册后可以在任意页面使用。 (2)局部注册,在页面的json文件中配置suingComponents进行注册&#…

探索APP内测分发的全过程(APP开发)

什么是APP内测分发探索APP内测分发的全过程? APP内测分发是在应用程序开发过程中探索APP内测分发的全过程,开发者将应用程序的测试版或预发布版分发给特定用户进行测试、反馈和评估的一种方式。这是一个非常重要的环节,可以有效地提高应用的…

Linux:冯诺依曼体系结构、操作系统、初识进程

文章目录 1.冯诺依曼体系结构总线与数据传输通路为什么有内存这个部分计算机存储结构 2.操作系统(Operator System)2.1 概念2.2 设计OS的目的2.3 理解“管理”先描述再组织 2.4 用户使用系统调用和库函数(lib)概念 总结 3.初识进程3.1 基本事实与引入3.2…

JavaFX创建桌面应用exe文件以及SceneBuilder使用讲解

文章目录 1 JavaFX1.1 引言1.2 简单使用1.2.1 搭建项目1.2.2 fxml文件1.2.3 生成exe文件 1.3 Idea中集成SceneBuilder1.4 注解讲解1.4.1 FXMLController1.4.2 FXML1.4.3 FXMLLoaderParameters1.4.4 FXMLProperty 1.5 SceneBuilder1.5.1 添加组件ControlsFX1.5.1.1页面展示 1.5.…

Vue入门篇:样式冲突scoped,data函数,组件通信,prop data单向数据流,打包发布

这里写目录标题 1.组件的样式冲突scoped2.data函数3.组件通信1.两种组件关系分类和对应的组件通信方案2.父子通信方案的核心流程 4.prop & data、单向数据流5.打包发布6.打包优化:路由懒加载 1.组件的样式冲突scoped 默认情况:写在组件中的样式会全局生效→因此很容易造成多…

PyCharm更换pip源、模块安装、PyCharm依赖包导入导出

一、Pycharm更换安装源 在下载安装好Pycharm后,一个在实际编程开发过程中非常重要的问题是第三方库添加,然而Python默认的源网络速度有点慢,因此,我们常常需要做的是更换Pycharm的安装源。 在当前最新版(2022.03版&…

Blender常见操作

1.局部视图:Local View,也可称作Solo模式,按快捷键 “/”进入,在按退出,只显示选中的物体(可多选),方便编辑 2.物体合并:Ctrl J 其中,当选中多个物体时&am…

XTuner微调LLM:1.8B、多模态和Agent-笔记四

本次课程由XTuner 贡献者李剑锋、汪周谦、王群老师讲解【XTuner 微调 LLM:1.8B、多模态和 Agent】课程 课程视频:http:// https://b23.tv/QUhT6ni 课程文档:https://github.com/InternLM/Tutorial/blob/camp2/xtuner/readme.md 两种Finetun…

border-image-slice详细说明

上一篇文章我们介绍了 border-image的用法,其中border-image-source、border-image-width、 border-image-outset都比较简单好理解,这边文章我们重点学一下border-image-slice 属性,它用于定义边框图像如何被切割并应用到元素的边框上。这个属…

JavaScript 动态网页实例 —— 数值处理对象

前言 Math对象用于进行数学运算。其属性是数学中一些常见的常数值,在程序中可以直接使用。Math对象的方法很多,主要完成一些常见的数学运算,如三角函数计算、乘方、开方、求对数等。在 Math 对象的方法中,除了random()之外的所有方法都需要一个或几个参数,并且其用法基本…

【数据结构】为了节省空间,对于特殊矩阵我们可以这样做……

特殊矩阵的压缩存储 导读一、数组与矩阵1.1 数组1.2 数组与线性表1.3 数组的存储结构1.4 矩阵在数组中的存储1.4.1 行优先存储1.4.2 列优先存储 二、特殊矩阵及其压缩存储三、对称矩阵及其存储3.1 方阵与对称矩阵3.2 对称矩阵的存储3.3 压缩存储的手动实现3.3.1 行优先存储3.3.…

修改Ubuntu远程登录欢迎提示信息

无论何时登录公司的某些生产系统,你都会看到一些登录消息、警告或关于你已登录服务器的信息,如下所示。 修改方式 1.打开ubuntu终端,进入到/etc/update-motd.d目录下面 可以发现目录中的文件都是shell脚本, 用户登录时服务器会自动加载这个目录中的文件…

大白话理解IoC和DI

引言 Spring是Java领域最受欢迎的开发框架之一,其核心功能之一就是Spring容器,也就是IoC容器。这篇文章,我们就来聊聊Spring的两大核心功能,控制反转(IOC)和依赖注入(DI)。 文章思…

Go 语言基础(二)【数组、切片、指针、map、struct】

1、数组 特别需要注意的是:在 Go 语言中,数组长度也是数组类型的一部分!所以尽管元素类型相同但是长度不同的两个数组,它们的类型并不相同。 1.1、数组的初始化 1.1.1、通过初始化列表{}来设置值 var arr [3]int // int类型的数…

09_Scala函数和对象

文章目录 函数和对象1.函数也是对象 scala中声明了一个函数 等价于声明一个函数对象2.将函数当作对象来用,也就是访问函数,但是不执行函数结果3.对象拥有数据类型(函数类型),对象可以进行赋值操作4.函数对象类型的省略写法,也就是…

SCI一区 | MFO-CNN-LSTM-Mutilhead-Attention多变量时间序列预测(Matlab)

SCI一区 | MFO-CNN-LSTM-Mutilhead-Attention多变量时间序列预测(Matlab) 目录 SCI一区 | MFO-CNN-LSTM-Mutilhead-Attention多变量时间序列预测(Matlab)预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现MFO-CNN…

常见公式的几何解释

本文旨在深入探讨常见数学公式的几何意义,通过直观的图形和解释,帮助读者更好地理解并掌握这些公式的本质。文章首先概述了公式与几何图形之间的紧密联系,然后选取了几个典型的数学公式,进行详细解析。每个公式都将配以相应的几何…

vuex的学习

首先下载vuex,然后建立一个目录在vueX中 接着在index。js文件夹中引入 引入后导出这个文件 在main.js文件中导入,这样vue就有了状态管理 接着我创建了2个组件,在 里边规定了一个num:0 在 打印出来就可以看见 映射函数mapState,必…

数据结构算法——链表带环问题——数学深度解析

前言:本节内容主要是讲解链表的两个问题 :1、判断链表是否带环; 2、一个链表有环, 找到环的入口点。 本节内容适合正在学习链表或者链表基础薄弱的友友们哦。 我们先将问题抛出来,友友们可以自己去力扣或者牛客网去找相应题目&…