MySQL中json_extract函数说明_mysql json_extract-程序员宅基地

技术标签: json  

1. json_extract 使用场景说明

在日常业务开发中通常mysql数据库中某个字段会需要存储json格式字符串,查询的时候有时json数据较大,每次全部取出再去解析查询效率较低,也较麻烦.

好在Mysql5.7及之后的版本里提供了json_extract函数,可以通过key查询value值(如果是json数组类型,可以通过下标获取对应位置的值),非常方便。

2. MySQL json_extract 函数简介

2.1 函数简介

Mysql5.7版本以后新增的功能,Mysql提供了一个原生的Json类型,Json值将不再以字符串的形式存储,而是采用一种允许快速读取文本元素(document elements)的内部二进制(internal binary)格式。 在Json列插入或者更新的时候将会自动验证Json文本,未通过验证的文本将产生一个错误信息。 Json文本采用标准的创建方式,可以使用大多数的比较操作符进行比较操作,例如:=, <, <=, >, >=, <>, != 和 <=>。

2.2 使用方式

数据存储的数据是json字符串(类型是vachar)。
想要查询出来json中某个字段的值,用到方法是:JSON_EXTRACT()。

语法:
**JSON_EXTRACT(json_doc, path[, path] …)**

用法提示:

  • 如果json字符串不是数组,则直接使用 $.字段名
  • 如果json字符串是数组[Array],则直接使用 $[对应的索引ID]

2.3 注意事项

JSON_EXTRACT性能验证 , 通过查看执行计划,验证全部都是全表扫描。
使用场景:数据量不大json字符串较大则可以采用,数据量较大不建议使用。

3. 数据验证

3.1 提取普通json中的值

说明:

  • 普通字段使用 $.KEY 获取
  • 数组字段使用 $.KEY[index] 获取,注意index从0开始
  • 实际使用中,如下json字符串只需要换成对应的表字段即可,但要注意需对json判空和替换等ETL转换操作.
select 
	json_extract('{"name":"zhangsan","tel_no":"136-6666-6666","hobbies":["basketball","run","sing"]}',"$.name") as name,
	json_extract('{"name":"zhangsan","tel_no":"136-6666-6666","hobbies":["basketball","run","sing"]}',"$.tel_no") as tel_no,
	json_extract('{"name":"zhangsan","tel_no":"136-6666-6666","hobbies":["basketball","run","sing"]}',"$.hobbies[0]") as hobby_1,
	json_extract('{"name":"zhangsan","tel_no":"136-6666-6666","hobbies":["basketball","run","sing"]}',"$.hobbies[1]") as hobby_2,
	json_extract('{"name":"zhangsan","tel_no":"136-6666-6666","hobbies":["basketball","run","sing"]}',"$.hobbies[2]") as hobby_3,
	json_extract('{"name":"zhangsan","tel_no":"136-6666-6666","hobbies":["basketball","run","sing"]}',"$.hobbies[3]") as hobby_4;

结果:

name tel_no hobby_1 hobby_2 hobby_3 hobby_4
“zhangsan” 136-6666-6666 “basketball” “run” “sing” NULL

3.2 提取json数组的值

site_user表

id name tags
1 zhangsan [“COMMON”]
2 lisi [“VIP”]
3 wangwu [“VVIP”,“PLATINUM”]
4 zhaoliu

提取用户的第一个标签:

select 
	id,
	name,
	tags, 
	json_extract(if(LENGTH(tags)>0,tags, '[]'),"$[0]")  # 如果tags无数据,赋值为空数组
from site_user;

结果:

id name tags
1 zhangsan “COMMON”
2 lisi “VIP”
3 wangwu “VVIP”
4 zhaoliu NULL
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/liuwei0376/article/details/125421909

智能推荐

opencv 图像上画出目标运动的轨迹_OpenCV视频分析-Meanshift、Camshift&运动轨迹绘制...-程序员宅基地

文章浏览阅读1.9k次。基于均值迁移的对象移动分析(Meanshift)️ ️概述本质:️ Mean Shift均值漂移算法是无参密度估计理论的一种,无参密度估计不需要事先知道对象的任何先验知识,完全依靠训练数据进行估计,并且可以用于任意形状的密度估计,在某一连续点处的密度函数值可由该点邻域中的若干样本点估计得出。直观的理解:️ 一堆点集,一个圆形的窗口在不断的移动,移动的方向是沿着点的密度最大的区域移动,图示如..._通过图像计算目标运动

安全防御------防火墙_防火墙策略里local区域-程序员宅基地

文章浏览阅读563次。本章主要讲解了防火墙的相关知识,包括基本概念,技术类型,安全区域,状态检测等。还包含FTP协议的有关概念以及ASPF技术。_防火墙策略里local区域

openjudge1.3答案_openjudge题库答案1.3-程序员宅基地

该文章为程序代码,主要包括使用C++和C语言解决问题的代码片段。

短视频矩阵系统的发展趋势与未来展望-程序员宅基地

文章浏览阅读600次,点赞12次,收藏11次。随着移动互联网的普及和用户消费习惯的改变,越来越多的内容创作者和企业开始注重短视频矩阵系统的建设。短视频矩阵系统具有多平台、多账号、多内容的特点,能够实现多角度、多层次的内容覆盖,提高品牌曝光度和用户粘性。随着短视频市场的成熟,商业模式创新将成为短视频矩阵系统可持续发展的重要保障。未来,短视频平台将探索更多元化的盈利模式,如广告投放、付费观看、打赏等,实现创作者、平台和用户的共赢。本文将探讨短视频矩阵系统的发展趋势和未来展望,以期为相关行业的发展提供有益的参考。三、短视频矩阵系统的未来展望。

更便捷更高效地生产影像地图瓦片_瓦片数据库生产-程序员宅基地

文章浏览阅读1k次。针对海量影像地图,采用地理处理建模构建切片业务流程,并应用“基于金字塔算法生成瓦片”的方案实施更高效的影像地图瓦片生产。_瓦片数据库生产

00942 ora 表存在_"ORA-00942: 表或视图不存在" 的原因和解决方法-程序员宅基地

文章浏览阅读1.3w次。1、问题产生的原因Oracle 是大小写敏感的,我们创自己写Sql脚本创建表的时候Oracle会自动将我们的表名,字段名转成大写。2、问题分析但是 Oracle 同样支持"" 语法,将表名或字段名加上""后,Oracle不会将其转换成大写。如果加上了"",那么我们采用一般的SQL语句查询则会产生“ORA-00942: 表或视图不存在 ”,因此SQL脚本中需要将表名也加上""。例如:select*..._ora00942表或视图不存在,但明明存在

随便推点

微信小程序:wx.navigateTo从子页面跳回父页面,页面不刷新的问题_navigateto 跳转再跳回时触发那个生命周期函数-程序员宅基地

文章浏览阅读1.8w次,点赞9次,收藏17次。先简要说说小程序的生命周期: 应用的生命周期:App({…}) 用来注册小程序,指定小程序的生命周期 页面的生命周期:Page({…}) 注册页面,指定页面的生命周期 具体注册函数的内容见小程序官网API其中有三个生命周期函数的触发顺序:onLoad-&gt;onShow-&gt;onReady (页面加载-&gt;页面显示-&gt;页面初次渲染) onLoad和onReady每个页面..._navigateto 跳转再跳回时触发那个生命周期函数

properties出现中文乱码解决方法(万能)_properties中文乱码-程序员宅基地

文章浏览阅读2.5k次。比如在vscode或者txt输入中文格式,在idea使用UTF-8表示,格式可不是真正的UTF-8!默认使用vscode或者txt编辑方式进行编辑,之后在idea进行打开,都会出现格式错误。可到了这一步,中文还是乱码(这一步改成功的网友可自动立场,没改成功的网友继续!至于改动不成功,原因在于文件编写的时候默认格式错误,于是怎么转换都出现问题(,在idea转换为UTF-8,格式可能乱码!正常思维来讲,估计是中文编码有问题,于是我将其改为UTF-8的编码方式。使用txt文件或者vscode文件,打开文件编写。_properties中文乱码

一个主题是王嘉尔的静态网页(html+css 附源代码)-程序员宅基地

文章浏览阅读1.1k次,点赞2次,收藏3次。【好像是没用到js 时间太久远所以忘记了】【没考虑多设备适配和弹性布局嗷 在大部分电脑上显示还是正常的】【依然很菜……纯粹写来玩的QAQ】【emo 最近好累吖】在我的电脑上(联想小新pro13呜呜呜大三的时候一定要换一台有独显的电脑)显示是这样的代码<html lang="en"><head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-

十六进制转换八进制_十六进制转换成八进制代码-程序员宅基地

文章浏览阅读6k次,点赞3次,收藏12次。代码如下#include&amp;lt;stdio.h&amp;gt;#include&amp;lt;math.h&amp;gt;#include&amp;lt;string.h&amp;gt;int main(){ int n,i,j,k,len,t; int b[10],c[10]; scanf(&quot;%d&quot;,&amp;amp;n); char a[10][99]; for(i_十六进制转换成八进制代码

用深度神经网络写一段股市预测代码-程序员宅基地

文章浏览阅读79次。根据历史数据建立模型,使用深度神经网络(DNN)训练模型,以预测股市走势:import numpy as npimport tensorflow as tf# 准备数据X = np.array([[1, 2, 3], [4, 5, 6]])y = np.array([7, 8])# 创建模型model = tf.keras.models.Sequential()model.add(tf...._深度学习股票预测代码

Linux updatedb命令教程:如何更新locate命令的文件名数据库(附实例详解和注意事项)-程序员宅基地

文章浏览阅读2k次,点赞60次,收藏42次。updatedb(update database)命令用于更新locate命令使用的文件名数据库。如果数据库已经存在,它的数据会被重用,以避免重新读取未改变的目录。updatedb通常由cron每日运行,以更新默认数据库。

推荐文章

热门文章

相关标签