关于 sql:如何从 MySQL 列中的 JSON 文档中获取最新值? | 珊瑚贝

How to get the latest value from the JSON document inside MySQL column?


Mysql版本是8.0.18-commercial
我编写了以下查询,它显示 details 列

的结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
select details from table t1;

Output:
[
  {
   “Msg”:“Job Running”,
   “Task”:“IN_PROGRESS”,
   “Date”:“2020-07-20 16:25:15”,
  },
  {
   “Msg”:“Job failed”,
   “Task”:“IN_PROGRESS”,
   “Date”:“2020-07-20 16:35:24”,
  }
]

我只希望 Msg 值来自具有最新 Date

的最后一个元素

我想要的输出是用 latest date 显示元素的 Msg :

1
2
ColumnName      ColumnValue
Msg             Job failed

我写了以下查询,但它给出了 null 输出

1
select details->>“$.Msg” from table t1;
  • 因此 stackoverflow.com/questions/39906435/… 了解如何将 JSON 数组转换为行。然后您可以使用 stackoverflow.com/questions/7745609/… 来获取具有最新值的行。
  • 您想要最后一个数组元素的消息,还是具有最新日期的元素的消息?
  • 我想要最新日期的元素的消息
  • 出于好奇,您为什么将其存储为 JSON?如果您以正常方式存储它会更容易,每个数组成员在一行中,每个对象字段在一个正常列中。在大多数情况下,将 JSON 用于此类结构数据会使查询 SQL 数据库中的数据变得更加困难。
  • 我正在从 mongo 集合中迁移数据,它可以以 JSON 文档的形式迁移


如果您正在运行 MySQ。 8.0,您可以使用 json_table() 将 json 数组取消嵌套到行,然后使用 row_number() 保留每个原始行的最新记录。

假设你的表的主键是 id,你可以这样表述:

1
2
3
4
5
6
7
8
9
10
11
12
13
select msg, activity_date
from (
    select x.*, row_number() over(partition by t.id order by x.activity_date desc) rn
    from mytable t
    cross join json_table(
        t.details,
        ‘$[*]’ columns(
            msg varchar(50) path ‘$.Msg’,
            activity_date datetime path ‘$.activityDate’
        )
    ) x
) t
where rn = 1

关于 DB Fiddle 的演示:

1
2
3
msg        | activity_date      
:——-— | :——————
Job failed | 20200720 16:35:24

来源:https://www.codenong.com/63004395/

微信公众号
手机浏览(小程序)
0
分享到:
没有账号? 忘记密码?