mysql存储过程处理json格式内容

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql存储过程处理json格式内容相关的知识,希望对你有一定的参考价值。

在original表里有个detail字段,内容分为3种如下json格式,现要将这3种不同内容的数据分折到新的三个表里:
在json的第一级,把“terminal”的存在tb1表里,在“event”里根据“id”不同再各自入tb2,tb3表


sid: "8r4f7",
uid: "104723",
tm: "20130220164443",
terminal:
os: "android",
osver: "2.3.7",
screenx: "480",
screeny: "854",




sid: "o3bb1",
uid: "104494",
tm: "20130218002919",
event:
begin: "20130218000056",
end: "20130218002919",
use: "2863",
id: "use_time"



"sid":"null",
"uid":"104262",
"tm":"20130204161323",
"event":
"around":"银行",
"use":"16:12",
"id":"transfer"



新表tb1的结构:
id sid uid tm os osver screenx screeny

新表tb2的结构:
id sid uid tm begin end use

新表tb3同理

这个问题对我来说很难,所以还是请大牛们指点一二,先谢谢了
这些数据都是客户端收集,放在一个json塞数据库里,现在我要做的是,从数据库里取出这个字段,分拆到不同表里,以方便以后查询统计

参考技术A mysql JSON UDF吧,原生并没有JSON解码支持

MYSQL中的JSON类型

JSON是mysql5.7新增的数据类型,打破了我对mysql数据存储的概念,在列中还能存储结构化的数据。

官方文档是很好理解的学习资源。

JSON类型格式,虽然插入的时候我们可以用字符串表示插入,但是mysql内部会被识别为json格式,也有一系列特殊处理方法。

在这之前,对mysql处理json数据的path类型的参数需要有个了解

  • ‘$‘这个代表json对象本身
  • ‘$.a‘代表json对象的key为a的对象
  • ‘$[0]‘,json对象是个数组时,为数组的第一个元素

当然表达式可以串联,如‘$.a[0]‘,代表

{
"a": [1, 2, 3],
"b": "hello"
}

中的1数字。

创建

JSON_ARRAY([val[, val] ...])

mysql> SELECT JSON_ARRAY(1, "abc", NULL, TRUE, CURTIME());
+---------------------------------------------+
| JSON_ARRAY(1, "abc", NULL, TRUE, CURTIME()) |
+---------------------------------------------+
| [1, "abc", null, true, "11:30:24.000000"]   |
+---------------------------------------------+

JSON_OBJECT([key, val[, key, val] ...])

mysql> SELECT JSON_OBJECT(‘id‘, 87, ‘name‘, ‘carrot‘);
+-----------------------------------------+
| JSON_OBJECT(‘id‘, 87, ‘name‘, ‘carrot‘) |
+-----------------------------------------+
| {"id": 87, "name": "carrot"}            |
+-----------------------------------------+

字符串

直接使用字符串插入数据库中,我发现也是可以的,mysql可以识别。
比如表json_test中jdata字段如果为JSON格式,则:

insert into json_test (jdata) values ( ‘{"a": 1, "b": 2, "c": {"d": 4}}‘);

也能插入有效json

JSON_QUOTE(string)

mysql> SELECT JSON_QUOTE(‘null‘), JSON_QUOTE(‘"null"‘);
+--------------------+----------------------+
| JSON_QUOTE(‘null‘) | JSON_QUOTE(‘"null"‘) |
+--------------------+----------------------+
| "null"             | ""null""           |

被quote后的字符串,似乎能作为合法的json对象直接写入

查询

mysql有一些在json中查找的函数,select中使用比较方便

JSON_CONTAINS(target, candidate[, path])

返回1或0是否找到

mysql> SET @j = ‘{"a": 1, "b": 2, "c": {"d": 4}}‘;
mysql> SET @j2 = ‘1‘;
mysql> SELECT JSON_CONTAINS(@j, @j2, ‘$.a‘);
+-------------------------------+
| JSON_CONTAINS(@j, @j2, ‘$.a‘) |
+-------------------------------+
|                             1 |
+-------------------------------+
mysql> SELECT JSON_CONTAINS(@j, @j2, ‘$.b‘);
+-------------------------------+
| JSON_CONTAINS(@j, @j2, ‘$.b‘) |
+-------------------------------+
|                             0 |
+-------------------------------+

这里的path变量,就是json中的路径表示。

JSON_EXTRACT(json_doc, path[, path] ...)

从json中选组部分内容,可以简写为->操作。

mysql> SELECT c, JSON_EXTRACT(c, "$.id"), g
     > FROM jemp
     > WHERE JSON_EXTRACT(c, "$.id") > 1
     > ORDER BY JSON_EXTRACT(c, "$.name");
+-------------------------------+-----------+------+
| c                             | c->"$.id" | g    |
+-------------------------------+-----------+------+
| {"id": "3", "name": "Barney"} | "3"       |    3 |
| {"id": "4", "name": "Betty"}  | "4"       |    4 |
| {"id": "2", "name": "Wilma"}  | "2"       |    2 |
+-------------------------------+-----------+------+
3 rows in set (0.00 sec)

mysql> SELECT c, c->"$.id", g
     > FROM jemp
     > WHERE c->"$.id" > 1
     > ORDER BY c->"$.name";
+-------------------------------+-----------+------+
| c                             | c->"$.id" | g    |
+-------------------------------+-----------+------+
| {"id": "3", "name": "Barney"} | "3"       |    3 |
| {"id": "4", "name": "Betty"}  | "4"       |    4 |
| {"id": "2", "name": "Wilma"}  | "2"       |    2 |
+-------------------------------+-----------+------+
3 rows in set (0.00 sec)

JSON_SEARCH(json_doc, one_or_all, search_str[, escape_char[, path] ...])

搜索返回匹配的path

mysql> SET @j = ‘["abc", [{"k": "10"}, "def"], {"x":"abc"}, {"y":"bcd"}]‘;

mysql> SELECT JSON_SEARCH(@j, ‘one‘, ‘abc‘);
+-------------------------------+
| JSON_SEARCH(@j, ‘one‘, ‘abc‘) |
+-------------------------------+
| "$[0]"                        |
+-------------------------------+

JSON_KEYS(json_doc[, path])

mysql> SELECT JSON_KEYS(‘{"a": 1, "b": {"c": 30}}‘);
+---------------------------------------+
| JSON_KEYS(‘{"a": 1, "b": {"c": 30}}‘) |
+---------------------------------------+
| ["a", "b"]                            |
+---------------------------------------+
mysql> SELECT JSON_KEYS(‘{"a": 1, "b": {"c": 30}}‘, ‘$.b‘);
+----------------------------------------------+
| JSON_KEYS(‘{"a": 1, "b": {"c": 30}}‘, ‘$.b‘) |
+----------------------------------------------+
| ["c"]                                        |
+----------------------------------------------+

修改

  • JSON_ARRAY_APPEND(json_doc, path, val[, path, val] ...)
  • JSON_ARRAY_INSERT(json_doc, path, val[, path, val] ...)
  • JSON_MERGE_PATCH(json_doc, json_doc[, json_doc] ...)
  • JSON_REMOVE(json_doc, path[, path] ...)
  • JSON_REPLACE(json_doc, path, val[, path, val] ...)
  • JSON_SET(json_doc, path, val[, path, val] ...)
  • JSON_UNQUOTE(json_val)

JSON元数据相关操作

  • JSON_DEPTH(json_doc) - 深度,空对象为0
  • ON_LENGTH(json_doc[, path]) - 这个不是返回占用的空间,而是比如对于数组,返回json数组有几个元素
  • JSON_TYPE(json_val) - OBJECT,ARRAY, INTEGER, DATETIME
  • JSON_VALID(val) - 字符串是否为合法JSON对象

以上是关于mysql存储过程处理json格式内容的主要内容,如果未能解决你的问题,请参考以下文章

mysql 存储过程处理array

MySQL的存储过程

Navicat for MySQL循环添加大量数据用啥

mysql对json取值路径怎么设置变量

Mysql存储过程(Java)

在mysql存储过程中使用concat创建json