【问题标题】:Splitting json elements in an array using json_array in mySQL在 mySQL 中使用 json_array 拆分数组中的 json 元素
【发布时间】:2019-10-04 08:48:33
【问题描述】:

我正在尝试从我正在创建 json 类型列的 mySQL 数据库表中检索一些信息。在这里,我输入了一个由单个 json 组成的完整 json 数组。

{"Date": "2019-09-30", "TableName": "es_apn_1", "Count": "3"}, {"Date": "2019-09-30", "TableName": "es_response_1", "Count": "297"}, {"Date": "2019-09-30", "TableName": "es_group_1", "Count": "356"}

所以我尝试使用 json_array() 和 json_object() 获取单个 json,然后获取它们各自的值。

我尝试过简单地输入 json:

{"Date": "2019-09-30", "TableName": "es_apn_1", "Count": "3"}, {"Date": "2019-09-30", "TableName": "es_response_1", "Count": "297"}, {"Date": "2019-09-30", "TableName": "es_group_1", "Count": "356"}

或以数组形式,如:

[{"Date": "2019-09-30", "TableName": "es_apn_1", "Count": "3"}, {"Date": "2019-09-30", "TableName": "es_response_1", "Count": "297"}, {"Date": "2019-09-30", "TableName": "es_group_1", "Count": "356"}]

或在 json 中:

{{"Date": "2019-09-30", "TableName": "es_apn_1", "Count": "3"}, {"Date": "2019-09-30", "TableName": "es_response_1", "Count": "297"}, {"Date": "2019-09-30", "TableName": "es_group_1", "Count": "356"}}

我用来获取结果的查询是:

select json_object(js,'Date'), json_object(js,'TableName'), json_object(js,'Count') from (select json_array(jsondata) as js);

其中 jsondata 是存在上述条目的列的名称。

但我得到了这种格式的结果。

{"[\"{\\\"Date\\\": \\\"2019-09-30\\\", \\\"TableName\\\": \\\"es_apn_1\\\", \\\"Count\\\": \\\"3\\\"}, {\\\"Date\\\": \\\"2019-09-30\\\", \\\"TableName\\\": \\\"es_response_1\\\", \\\"Count\\\": \\\"297\\\"}, {\\\"Date\\\": \\\"2019-09-30\\\", \\\"TableName\\\": \\\"es_group_1\\\", \\\"Count\\\": \\\"356\\\"}\"]": "Date"} | {"[\"{\\\"Date\\\": \\\"2019-09-30\\\", \\\"TableName\\\": \\\"es_apn_1\\\", \\\"Count\\\": \\\"3\\\"}, {\\\"Date\\\": \\\"2019-09-30\\\", \\\"TableName\\\": \\\"es_response_1\\\", \\\"Count\\\": \\\"297\\\"}, {\\\"Date\\\": \\\"2019-09-30\\\", \\\"TableName\\\": \\\"es_group_1\\\", \\\"Count\\\": \\\"356\\\"}\"]": "TableName"} | {"[\"{\\\"Date\\\": \\\"2019-09-30\\\", \\\"TableName\\\": \\\"es_apn_1\\\", \\\"Count\\\": \\\"3\\\"}, {\\\"Date\\\": \\\"2019-09-30\\\", \\\"TableName\\\": \\\"es_response_1\\\", \\\"Count\\\": \\\"297\\\"}, {\\\"Date\\\": \\\"2019-09-30\\\", \\\"TableName\\\": \\\"es_group_1\\\", \\\"Count\\\": \\\"356\\\"}\"]": "Count"}

您能否帮助我查询或插入条目以正确获得所需输出的格式?

【问题讨论】:

  • "或在 json 中:" 你称之为 json 的格式 -> {{"Date": "2019-09-30", "TableName": "es_apn_1", "Count": "3"}, {"Date": "2019-09-30", "TableName": "es_response_1", "Count": "297"}, {"Date": "2019-09-30", "TableName": "es_group_1", "Count": "356"}} 不是 json ...检查jsonlint.com
  • .. 为什么不将它存储在 SQL 表中呢?从表面上看,数据接缝对我来说非常合理
  • @RaymondNijland 实际上这只是我的条目的一个 sn-p。我将输入具有多个可能不同的键值对的多个条目,并添加另一列以区分它们。所以这就是为什么我要检查我是否可以实现它。

标签: mysql json database mariadb


【解决方案1】:

你可以用这个命令来做:

CREATE TABLE tbl (id int auto_increment primary key, jdat json);

INSERT INTO tbl (jdat) 
  VALUES ('[{"Date": "2019-09-30", "TableName": "es_apn_1", "Count": "3"},
            {"Date": "2019-09-30", "TableName": "es_response_1", "Count": "297"},
            {"Date": "2019-09-30", "TableName": "es_group_1", "Count": "356"}]');

select JSON_EXTRACT(jdat,'$[0].Date') from tbl

在这里查看我的小演示:https://rextester.com/DPQ80237

正如@Raymond Nijland 所说的非常正确,推荐的存储此类信息的方法是在适当的表格中,如下所示:

create table tbl2 (id int auto_increment primary key, refid int, tdate date, tname nvarchar(32), tcount int);

INSERT INTO tbl2 (refid, tdate, tname, tcount) 
  VALUES (1,'2019-09-30','es_apn_1',3),
         (1,'2019-09-30','es_response_1',297),
         (1,'2019-09-30','es_group_1',356);

通过这样的设计,包含的数据更容易被搜索或JOINs 与其他表格一起访问...

【讨论】:

  • 看起来数据接缝对我来说非常合理,将其存储在 SQL 表中对我来说更合乎逻辑......
  • 是的,@RaymondNijland,我几乎总是喜欢“真实”表格格式的存储!我能看到 JSON 数据有用的唯一例外是数据对单个元素(记录)的有限上下文感兴趣的地方。并且没有人会蜜蜂搜索它的任何属性!我只是发布这个答案来表明,有一种方法可以做 OP 想要的。我不一定同意 OP 的做法。
  • " 没有人会在哪里搜索它的任何属性!" 你也可以使用生成的列来索引 JSON ......或者使用你可以使用的 TEXT 副本FULLTEXT 索引.. 或者制作一个倒排索引表..如果你真的不得不无论如何我们正在移动一点偏离主题,所有选项都可以工作,因为我已经问过 topicstarter 为什么选择 json 存储..
  • 谢谢大家的回复,我忘了在我的问题上提到我已经尝试过并且从这种类型的数据输入中获得了正确的结果。但是我必须尝试另一种方法,我可以只为单个日期条目输入一个 json,我可以通过一个查询来获取我的所有结果。
猜你喜欢
  • 2020-07-30
  • 1970-01-01
  • 1970-01-01
  • 2015-04-12
  • 1970-01-01
  • 2021-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多