首页 > 数据库 >MySQL8.0 JSON相关函数(二) -更改JSON值

MySQL8.0 JSON相关函数(二) -更改JSON值

时间:2023-08-04 17:35:06浏览次数:45  
标签:更改 -- MERGE JSON MySQL8.0 path ARRAY null

(目录)

本文涉及函数简介

函数 作用
JSON_ARRAY_APPEND 在数组后追加元素
JSON_ARRAY_INSERT 在JSON数据中的指定位置插入元素
JSON_INSERT 如果存在值,不操作,否则插入值
JSON_REPLACE 如果存在值,更新该值,否则不操作
JSON_SET 如果存在值,就更新,否则就插入
JSON_REMOVE 如果存在值,就删除,否则无效果
JSON_MERGE_PATCH
JSON_MERGE_PRESERVE = JSON_MERGE
JSON_QUOTE 将字符串转换为JSON值,对其中的特殊符号进行转义。
JSON_UNQUOTE 将JSON值转换为字符串,并去除其中的转义字符

更改JSON的函数

数组相关函数

JSON_ARRAY_APPEND

JSON_ARRAY_APPEND(json_doc, path, val[, path, val] ...) 从JSON文档中查找path路径的内容,然后在其内容的最后追加值,如果path的类型不是数组,将其视为数组中的一个元素

mysql> select value,JSON_ARRAY_APPEND(value,"$[0]",1),JSON_ARRAY_APPEND(value,"$[1]",3),JSON_ARRAY_APPEND(value,"$[2]","c")  from test_json\G
*************************** 1. row ***************************
                              value: ["a", ["b", "c"], {"d": 5}, "f"]
-- $[0] = "a", 视为 ["a"] 在后方追加1 = ["a", 1]
  JSON_ARRAY_APPEND(value,"$[0]",1): [["a", 1], ["b", "c"], {"d": 5}, "f"] 
--  $[1] = ["b", "c"] ,在后方追加3 = ["b", "c", 3]
  JSON_ARRAY_APPEND(value,"$[1]",3): ["a", ["b", "c", 3], {"d": 5}, "f"] 
-- $[2] = {"d": 5} , 视为 [{"d": 5}] 在后方追加"c" = [{"d": 5}, "c"]
  JSON_ARRAY_APPEND(value,"$[2]","c"): ["a", ["b", "c"], [{"d": 5}, "c"], "f"] 

JSON_ARRAY_INSERT

从JSON文档中查找path路径的内容,如果path是数组中的元素,就将在该位置插入值,其他元素右移,如果path不是数组中的元素,无作用,如果path的位置超过了数组的末尾,就将值插入到数组的末尾 JSON_ARRAY_INSERT(json_doc, path, val[, path, val] ...)

mysql> select value,JSON_ARRAY_INSERT(value,"$[0]",1),JSON_ARRAY_INSERT(value,"$[1]",3),JSON_ARRAY_INSERT(value,"$[1][1]","c"),JSON_ARRAY_INSERT(value,"$[2][0]","c")  from test_json\G
*************************** 1. row ***************************
                                 value: ["a", ["b", "c"], {"d": 5}, "f"]
-- "$" 是数组,插入到$[0]的位置
     JSON_ARRAY_INSERT(value,"$[0]",1): [1, "a", ["b", "c"], {"d": 5}, "f"]
     JSON_ARRAY_INSERT(value,"$[1]",3): ["a", 3, ["b", "c"], {"d": 5}, "f"]
-- "$[1]" = ["b", "c"] 是数组,插入到$[1][1]的位置
JSON_ARRAY_INSERT(value,"$[1][1]","c"): ["a", ["b", "c", "c"], {"d": 5}, "f"]
-- "$[2]" = {"d": 5} 不是数组,插入无效
JSON_ARRAY_INSERT(value,"$[2][0]","c"): ["a", ["b", "c"], {"d": 5}, "f"]

增删改

示例详见参考MySQL8.0 JSON数据类型的更新JSON值部分

JSON_INSERT

JSON_INSERT(json_doc, path, val[, path, val] ...) 如果指定path不存在内容,插入数据,否则无效果

JSON_REPLACE

JSON_REPLACE(json_doc, path, val[, path, val] ...) 如果指定path存在内容,更新数据,否则无效果

JSON_SET

JSON_SET(json_doc, path, val[, path, val] ...) 如果指定path存在内容,更新数据,否则插入数据

JSON_REMOVE

JSON_REMOVE(json_doc, path[, path] ...) 如果指定path存在内容,删除该内容

合并JSON值

JSON_MERGE_PATCH

JSON_MERGE_PATCH(json_doc, json_doc[, json_doc] ...) 合并多个JSON文档,不保留重复值 合并规则:

  • 如果第一个参数不是JSON对象,将空对象和第二个参数合并
  • 如果第二个参数不是JSON对象,合并的结果就是第二个对象
  • 如果两个参数都是JSON对象,结果如下:
    • 如果第一个参数中存在值为null的键,保留键值对
    • 如果第二个参数中存在值为null的键,并且该键再第一个参数中存在,删除该键值对
    • 具有不同键的值保留原值,具有相同键的值,保留最后一个参数中的值 合并会递归执行,也就是,如果在两个参数中存在相同的键,并且键值都是JSON对象,其中的JSON对象也会进行合并,然后保留最终合并的结果
mysql> SELECT JSON_MERGE_PATCH('[1, 2]', '[true, false]'),JSON_MERGE_PATCH('{"name": "x"}', '{"id": 47}'),JSON_MERGE_PATCH('1', 'true'),JSON_MERGE_PATCH('{ "a": 1, "b":2 }','{ "a": 3, "c":4 }'),JSON_MERGE_PATCH('{"a":null}','{"b":1}'),JSON_MERGE_PATCH('{"a":1,"c":5}','{"c":null}'),JSON_MERGE_PATCH('{"a":{"x":1}}', '{"a":{"y":2}}')\G
*************************** 1. row ***************************
-- 两个数组合并,结果是后一个数组
              JSON_MERGE_PATCH('[1, 2]', '[true, false]'): [true, false]
-- 两个JSON对象合并,结果是一个包含两组键值对的JSON对象
          JSON_MERGE_PATCH('{"name": "x"}', '{"id": 47}'): {"id": 47, "name": "x"}
-- 数值和布尔值合并,结果是后一个布尔值
                            JSON_MERGE_PATCH('1', 'true'): true
-- 两个JSON对象合并,由于"a"键在两个文档中都存在,保留后面出现的值=3
JSON_MERGE_PATCH('{ "a": 1, "b":2 }','{ "a": 3, "c":4 }'): {"a": 3, "b": 2, "c": 4}
-- 第一个参数中存在值为null的键值对保留
                 JSON_MERGE_PATCH('{"a":null}','{"b":1}'): {"a": null, "b": 1}
-- 第二个参数中存在值为null的键,把前一个参数中的键值对也移除
           JSON_MERGE_PATCH('{"a":1,"c":5}','{"c":null}'): {"a": 1}
-- 存在子文档,嵌套合并
       JSON_MERGE_PATCH('{"a":{"x":1}}', '{"a":{"y":2}}'): {"a": {"x": 1, "y": 2}}

JSON_MERGE_PRESERVE

JSON_MERGE_PRESERVE(json_doc, json_doc[, json_doc] ...) 同义词:JSON_MERGE(json_doc, json_doc[, json_doc] ...) 合并多个JSON文档,保留重复值 合并规则:

  • 多个数组合并为一个数组
  • 多个对象合并为一个对象
  • 其余值被视为存在单个元素的数组,并与数组合并
  • 数组和对象合并为一个数组
mysql> SELECT JSON_MERGE_PRESERVE('[1, 2]', '[true, false]'),JSON_MERGE_PRESERVE('{"name": "x"}', '{"id": 47}'),JSON_MERGE_PRESERVE('1', 'true'),JSON_MERGE_PRESERVE('[1, 2]', '{"id": 47}'),JSON_MERGE_PRESERVE('{ "a": 1, "b": 2 }','{ "a": null, "c": 4 }'),JSON_MERGE_PRESERVE('{"a":{"x":1}}', '{"a":{"x":3,"y":2}}') \G
*************************** 1. row ***************************
-- 两个数组合并成一个数组
                   JSON_MERGE_PRESERVE('[1, 2]', '[true, false]'): [1, 2, true, false]
-- 两个对象合并成一个对象
               JSON_MERGE_PRESERVE('{"name": "x"}', '{"id": 47}'): {"id": 47, "name": "x"}
-- 数值和布尔值合并成一个数组,数值和布尔值分别作为数组中的一个元素
                                 JSON_MERGE_PRESERVE('1', 'true'): [1, true]
-- 数组和对象合并成一个数组,对象作为数组中的一个元素
                      JSON_MERGE_PRESERVE('[1, 2]', '{"id": 47}'): [1, 2, {"id": 47}]
-- 多个对象存在相同键,将键值进行合并。null值不会导致键删除,而是作为数组中的一个元素合并
JSON_MERGE_PRESERVE('{ "a": 1, "b": 2 }','{ "a": null, "c": 4 }'): {"a": [1, null], "b": 2, "c": 4}
-- 存在子文档,嵌套合并
      JSON_MERGE_PRESERVE('{"a":{"x":1}}', '{"a":{"x":3,"y":2}}'): {"a": {"x": [1, 3], "y": 2}}

字符串和JSON格式转换

JSON_QUOTE

JSON_QUOTE(string) 将字符串转换为JSON值,对其中的特殊符号进行转义。

mysql> SELECT JSON_QUOTE('null'), JSON_QUOTE('"null"'),JSON_QUOTE('[1, 2, 3]')\G
*************************** 1. row ***************************
     JSON_QUOTE('null'): "null"
   JSON_QUOTE('"null"'): "\"null\""
JSON_QUOTE('[1, 2, 3]'): "[1, 2, 3]"

JSON_UNQUOTE

取消JSON值外的引号以及内部的转义字符并以utf8mb4字符串的形式返回结果。是JSON_QUOTE的反向转换 JSON_UNQUOTE(json_val)

mysql> select JSON_UNQUOTE("NULL"),JSON_UNQUOTE("\"null\""),JSON_UNQUOTE("[1, 2, 3]")\G
*************************** 1. row ***************************
     JSON_UNQUOTE("NULL"): NULL
 JSON_UNQUOTE("\"null\""): null
JSON_UNQUOTE("[1, 2, 3]"): [1, 2, 3]
特殊字符说明

转义字符区分大小写,如果不是JSON_UNQUOTE函数支持的转义字符,会忽略反斜杠,直接返回后面的字符,例如\b等同于退格符,但是\B等同于B

JSON_UNQUOTE函数支持的转义字符表

转义后 转义前
\" 双引号"
\b 退格符(Backspace)
\f 换页符
\n 换行符(Enter)
\r 回车符
\t 水平制表符(Tab)
\\ 反斜杠\
\uXXXX Unicode值为XXXX的UTF-8字节

标签:更改,--,MERGE,JSON,MySQL8.0,path,ARRAY,null
From: https://blog.51cto.com/yueyinsha/6965061

相关文章

  • C# 读取json配置文件appsettings.json
    添加NuGet包Microsoft.Extensions.Configuration.FileExtensions;Microsoft.Extensions.Configuration.Json;appsettings.json示例 代码:publicstaticvoidGetBuilder(stringpath){varbuilder=newConfigurationBuilder()......
  • 【答疑】jsonpath和beanshell配合使用案例
    问题今天提升群小伙伴问了这样一个问题:接口返回如下(list元素个数不确定),需要提取所有的iautoid,然后用逗号拼接起来,如果是如下返回,需要得到的结果是1687283717749342208,1679392630364184576,后续请求需要使用{ "data":{ "firstPage":true, "lastPage":false, "list":......
  • LightGBM为什么比xgbost好?——选择梯度大(残差大)样本来进行特征分裂生成的树,借鉴了Ad
    LightGBM(LightGradientBoostingMachine)是一款基于决策树算法的分布式梯度提升框架。为了满足工业界缩短模型计算时间的需求,LightGBM的设计思路主要是两点:减小数据对内存的使用,保证单个机器在不牺牲速度的情况下,尽可能地用上更多的数据;减小通信的代价,提升多机并行时的效率,实现在......
  • Golang 使用 JSON unmarshal 数字到 interface{} 数字变成 float64 类型
    最近在golang业务开发时,遇到一个坑。我们有个服务,会接收通用的interface对象,然后去给用户发消息。因此会涉及到把各个业务方传递过来的字符串,转成interface对象。但是因为我的字符串里有一个数字,比如下面demo里的{"number":1234567},而且数字是7位数,在经过json.Unmarshal后,被转成......
  • json文件编辑功能
    1Json格式JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。它基于ECMAScript(EuropeanComputerManufacturersAssociation,欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。JSON在2001年由DouglasCrockford提出,......
  • 全国各乡镇的边界数据,json格式适配echarts;
    湖南省的数据现有,联系我获取(免费、帮我看一下小程序);其他省份可通过联系我用脚本获取(要手动输入验证码),或者网站获取(tips:每个区县需要一个个手动下载,且每个下载需要输入验证码):https://www.poi86.com/ ......
  • less中更改iview组件默认样式
    1.先声明变量'deep'@deep:~">>>";2.使用该变量去修改ivew的样式@{deep}.ivu-modal-body//与类之间要有空格完整代码:@deep:~">>>";#qualityControlIssueList{height:100%;.textRight{text-align:right}.searchForm{......
  • fastjson 1.2.80 漏洞浅析及利用payload
    0x01说明在fastjson的1.2.80版本中可以通过将依赖加入到java.lang.Exception期望类的子类中,绕过checkAuto。0x02简析{"@type":"java.lang.Exception","@type":"org.codehaus.groovy.control.CompilationFailedException","unit":{......
  • golang json字符串转结构体
    1、不知道结构体类型的情况下funcJsonStringToMap(jsonStrstring)(map[string]interface{},error){//未知值类型m:=make(map[string]interface{})err:=json.Unmarshal([]byte(jsonStr),&m)iferr!=nil{fmt.Printf("Unmarshalwither......
  • MySQL8.0 JSON数据类型
    (目录)JSON数据类型MySQL8.0支持原生的JSON数据类型。JSON数据类型存在以下优点自动验证存储在json列中的JSON文档,无效文档会产生错误优化存储格式。json列中的文档被转换为内部格式,可以直接对文档元素进行快速读取访问。JSON值JSON值类型在MySQL中,JSON值可以是字符串/数......