首页 > 数据库 >MySQL JSON函数文档搬运

MySQL JSON函数文档搬运

时间:2022-08-20 18:25:04浏览次数:73  
标签:-- address json JSON 文档 MySQL test SELECT

本文搬运了MySQL对JSON的支持相关的函数

/* 自MySQL 5.7版本以后,加入了JSON字段类型支持,并提供一系列函数
   实测字段类型设置为varchar,只要字段值为合法json,MYSQL JSON对应的函数都可以使用
*/

-- 1 返回一个JSON数组
SELECT JSON_ARRAY(1, "abc", NULL, TRUE, CURTIME());

-- 2 返回一个JSON对象
SELECT JSON_OBJECT('id', 87, 'name', 'carrot');

-- 3 转义
SELECT JSON_QUOTE('null'), JSON_QUOTE('"null"'), JSON_QUOTE(null), JSON_quote('{"name":"zhangsan","age":44}');

-- **4 返回目标JSON中是否包含查询的值,结果为0/1  
-- JSON_CONTAINS(target, candidate[, path])
SELECt json_contains(json_address, JSON_QUOTE('西安'), '$.city') from test;
-- SELECT JSON_CONTAINS(string_address, JSON_QUOTE('西安'), '$.city') FROM test;
-- 错误写法,第二个参数需要用JSON_QUOTE进行转义,并且只支持精确查找
-- SELECT JSON_CONTAINS(json_address, '西安', '$.city') FROM test;

-- 5 检查目标JSON中是否包含对应路径 
-- JSON_CONTAINS_PATH(json_doc, one_or_all, path[, path] ...)
SELECT JSON_CONTAINS_PATH(json_address, 'one', '$.province', '$.name') FROM test;
SELECT JSON_CONTAINS_PATH(json_address, 'all', '$.province', '$.name') FROM test;

-- **6 返回一个JSON文档的属性值,返回值包含双引号
-- JSON_EXTRACT(json_doc, path[, path] ...)
SELECT json_address->'$.province' FROM test;
SELECT JSON_EXTRACT(json_address, '$.province') FROM test;

SELECT JSON_EXTRACT('[10, 20, [30, 40]]', '$[1]');
SELECT JSON_EXTRACT('[10, 20, [30, 40]]', '$[1]', '$[0]');
SELECT JSON_EXTRACT('[10, 20, [30, 40]]', '$[2][*]');
SELECT JSON_EXTRACT('[10, 20, [30, 40]]', '$[2][1]');

-- **6.1 查询JSON的某个属性,返回值不包含双引号
SELECT json_address->>'$.province' FROM test;
SELECT JSON_UNQUOTE(JSON_EXTRACT(json_address, '$.province')) FROM test;
-- column->path 可以按照属性值进行查询,分组,排序等操作
SELECT json_address,json_extract(json_address, '$.province') from test where json_extract(json_address, '$.city') = '西安';
SELECT json_address->'$.province' FROM test WHERE json_address->'$.province' = '河南';
SELECT json_address->>'$.province' FROM test WHERE json_address->>'$.province' = '河南';

-- 7 返回JSON文档的顶层值的key(支持嵌套),该函数要求目标字段值为一个合法的JSON,否则会抛出错误
-- JSON_KEYS(json_doc[, path])
SELECT JSON_KEYS(json_address) FROM test;
SELECT JSON_KEYS(json_address, '$.attr') FROM test;

-- 8 对比两个JSON: 比较两个JSON文档。如果两个文档有任何共同的键值对或数组元素,则返回true (1)。如果两个参数都是标量,则函数执行简单的相等性测试。如果任一参数为NULL,则函数返回NULL。
-- JSON_OVERLAPS(json_doc1, json_doc2) 
-- SINCE MySQL 8.0.17
SELECT JSON_OVERLAPS(json_address, string_address) FROM test;

-- 9 返回JSON文档中给定字符串的路径,支持模糊匹配
-- JSON_SEARCH(json_doc, one_or_all, search_str[, escape_char[, path] ...])
SELECT json_search(json_address, 'one', '陕西') FROM test;
SELECT json_search(json_address, 'one', '%西%') FROM test;
SELECT json_search(json_address, 'all', '%西%') FROM test;

-- 10 从指定文档中给定的路径处的JSON文档中提取值,并返回提取的值,可选地将其转换为所需的类型
-- JSON_VALUE(json_doc, path)
SELECT json_value(json_address, '$.province') FROM test;
SELECT json_value(json_address, '$.number' RETURNING DECIMAL(6,2)) FROM test;

-- 11 如果value是json_array的元素,则返回true (1),否则返回false (0)。值必须是标量或JSON文档; 如果它是标量,则运算符尝试将其视为JSON数组的元素。如果value或json_array为NULL,则函数返回NULL。
-- value MEMBER OF(json_array)
SELECT 'ab' MEMBER OF('[23, "abc", 17, "ab", 10]');
SELECT 'a' MEMBER OF('[23, "abc", 17, "ab", 10]');
SELECT JSON_ARRAY(4,5) MEMBER OF('[[3,4],[4,5]]');

-- 12 将值附加到JSON文档中指示的数组的末尾,并返回结果。如果任何参数为NULL,则返回NULL。如果json_doc参数不是有效的JSON文档,或者任何path参数不是有效的路径表达式,或者包含 * 或 ** 通配符,则会发生错误。
-- JSON_ARRAY_APPEND(json_doc, path, val[, path, val] ...) 
-- 在MySQL 5.7中,这个函数被命名为JSON_APPEND()。MySQL 8.0中不再支持该名称。
SELECT JSON_ARRAY_APPEND('["a", ["b", "c"], "d"]', '$[1]', 1);

-- 13 更新JSON文档,插入到文档中的数组中,然后返回修改后的文档。
-- JSON_ARRAY_INSERT(json_doc, path, val[, path, val] ...)
SELECT JSON_ARRAY_INSERT('["a", ["b", "c"], "d"]', '$[1]', 1);

-- 14 将数据插入到JSON文档中并返回结果。如果对应的路径已存在,不会更新对应的值
-- JSON_INSERT(json_doc, path, val[, path, val] ...)
SELECT JSON_INSERT(json_address, '$.province', '江西') FROM test WHERE id = 1;
SELECT JSON_INSERT(json_address, '$.test', 'home') FROM test WHERE id = 1;

-- 15 合并两个json文档
-- JSON_MERGE(json_doc, json_doc[, json_doc] ...) 后续可能会弃用
-- JSON_MERGE_PRESERVE(json_doc, json_doc[, json_doc] ...) -- 相同键名时,进行了合并
-- JSON_MERGE_PATCH(json_doc, json_doc[, json_doc] ...) -- 相同键名时,后面参数覆盖前面参数
SELECT JSON_MERGE('[1, 2]', '[true, false]');

SET @x = '{ "a": 1, "b": 2 }',
    @y = '{ "a": 3, "c": 4 }',
    @z = '{ "a": 5, "d": 6 }';
    
SELECT JSON_MERGE_PATCH(@x, @y, @z)    AS Patch,
       JSON_MERGE_PRESERVE(@x, @y, @z) AS Preserve\G;

-- 16 从JSON文档中删除数据并返回结果
-- JSON_REMOVE(json_doc, path[, path] ...)
SELECT JSON_REMOVE(json_address, '$.province') FROM test WHERE id = 1;

-- **17 插入,更新,替换JSON文档中的值
-- JSON_SET() 替换现有值并添加不存在的值。
-- JSON_INSERT() 在不替换现有值的情况下插入值。
-- JSON_REPLACE() 仅替换现有值。

-- 18 返回JSON文档的最大深度
-- JSON_DEPTH(json_doc)

-- 19 返回JSON文档的长度
-- JSON_DEPTH(json_doc)

-- 20 判断JSON值的类型,可能为object,array,或者标量
-- JSON_TYPE(json_val)

-- **21 返回0或1以指示值是否为有效JSON。
-- JSON_VALID(val)

-- 22 从JSON文档中提取数据,并将其作为具有指定列的关系表返回。
-- JSON_TABLE(expr, path COLUMNS (column_list) [AS] alias)
SELECT
  *
FROM
  JSON_TABLE (
    '[{"a":"3"},{"a":2},{"b":1},{"a":0},{"a":[1,2]}]',
    "$[*]" COLUMNS (
      rowid FOR ORDINALITY,
      ac VARCHAR (100) PATH "$.a" DEFAULT '111'
      ON EMPTY DEFAULT '999'
      ON ERROR,
      aj JSON PATH "$.a" DEFAULT '{"x": 333}'
      ON EMPTY,
      bx INT EXISTS PATH "$.b"
    )
  ) AS tt;

-- 23 根据JSON规范对JSON文档进行验证
-- JSON_SCHEMA_VALID(schema,document)
SET @schema = '{
     "id": "http://json-schema.org/geo",
     "$schema": "http://json-schema.org/draft-04/schema#",
     "description": "A geographical coordinate",
     "type": "object",
     "properties": {
       "latitude": {
         "type": "number",
         "minimum": -90,
         "maximum": 90
       },
       "longitude": {
         "type": "number",
         "minimum": -180,
         "maximum": 180
       }
     }
    }';

SELECT
  JSON_SCHEMA_VALID (
    @schema,
    '{
     "latitude": 263.444697,
     "longitude": 10.445118
    }'
  );

-- 24 JSON工具函数
-- 24.1 JSON美化输出
SELECT json_pretty(json_address) FROM test WHERE id = 1;

-- 24.2 计算使用JSON_SET,JSON_REPLACE,JSON_REMOVE更新JSON字段后,释放的二进制字节数
-- JSON_STORAGE_FREE(json_val)

-- 24.3 该函数返回用于存储JSON文档的二进制表示形式的字节数
-- JSON_STORAGE_SIZE(json_val)
SELECT json_storage_size(json_address) FROM test WHERE id = 1;

附官方文档地址:https://dev.mysql.com/doc/refman/8.0/en/json-functions.html

标签:--,address,json,JSON,文档,MySQL,test,SELECT
From: https://www.cnblogs.com/dust2/p/16608328.html

相关文章

  • Java List转 JSONObject
    JavaList转JSONObjectpom.xml<dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>......
  • JSON的概念和语法定义
    JSON的概念概念:JavaScriptObjectNotationJavaScript对象表示法json现在多用于存储和交换文本信息的语法进行数据的传输JSON比XML更小、更快,更易解析JSON是轻量......
  • MYSQL 工具之mysqladmin
    MYSQL工具之mysqladminmysqladmin是一个MySQL服务器命令行工具,它由DatabaseAdministrators执行一些基本的命令诸如更改root密码、监控mysql进程、重新加载权限、检......
  • delphi基于结构的CRUD(JSON)
    delphi基于结构的CRUD(JSON)以采购订单为例。unitrest.tcgddtcgdd2;//代码由代码工厂自动生成//2022-08-2016:04:54{$Idef.inc}interfaceuses{$IFDEFfiredac......
  • JSON概念和JSON语法的定义与值的获取
    JSON概念概念: JavaScript Object NotationJavaScript对象标记法var p={"name":"张三","age":23,"gender":"男"}; json现在多用于存储和交换文本信息的语法......
  • FireDAC使用Mormot开发Rest服务器,返回JSON数据格式的问题
    FireDAC沿用了一贯的DataSnap的数据返回方式,这也使得开发出来的REST Server很给难给第三方应用提供服务用什么办法可以解决FireDAC直接序列返回的Json只是数据信息,而不是......
  • MySQL中的时间问题(二)
    MySQL中存储的时间,主要分为datetime类型和int类型。一般来说规范的存法是存int型,特别是像过期时间、最近更新等需要排序、比较大小的时间,更应该存为int型。但最近的项目数......
  • 2022-08-15 吉林化工学院 第五组 韩嘉宁(MySQL基础)
    掌握情况:已全部理解并且应用基本熟练。学习心得:难得的轻松!!!但基本都是理论知识,需要加强记忆理解!Mysql数据库目录掌握情况:已全部理解并且应用基本熟练。学习心得:难得的轻......
  • mysql初识
    mysql需要了解哪些知识1.sql操作2.索引索引原理索引优化sql语句优化3.事务并发读异常的问题并发死锁怎么解决4.mysql与缓存解决读性能问题集群的内容 OLTP:......
  • 让人纠结的PG字段json类型
    PostgreSQL确实牛逼得很。PostgreSQL有个json数据类型。当你用json类型设定表的字段时,你用select语句相当爽。问题是当你使用中间件时如FireDAC等,进行数据保存时,就会出现......