【问题标题】:Delete date objects in JSON field with MySQL使用 MySQL 删除 JSON 字段中的日期对象
【发布时间】:2021-03-04 13:10:31
【问题描述】:

我有一个带有 JSON 类型列的 MySQL 表。在此列中,我有如下数据行:

[{"meeting": "2020-12-02"}, {"meeting": "2020-01-17"}, {"meeting": "2021-01-17"}]
[{"meeting": "2020-08-02"}, {"meeting": "2021-01-17"}]

是否可以构造一个 MySQL 查询来删除所有日期早于 date(NOW) 的 JSON 对象?

在 MySQL 数据库版本中:5.7.31-34

表中还存在一个 ID 列。

我无法将字段类型更改为 JSON!

【问题讨论】:

  • 您不想简单地存储标准化数据吗?

标签: mysql sql arrays json datetime


【解决方案1】:

在 MySQL 8.0 中,您可以使用 json_table() 将 json 数组取消嵌套到行,然后过滤掉过去的数据并重新聚合。你需要一个主键,我假设id

select id, json_arrayagg(json_object('meeting', x.meeting)) as new_col
from mytable t
cross join json_table (t.col, '$[*]' columns (meeting date path '$.meeting')) x
where x.meeting > current_date
group by id

Demo on DB Fiddle

编号 | new_col -: | :------------------------------------------------ ---- 1 | [{“会议”:“2020-12-02”},{“会议”:“2021-01-17”}] 2 | [{“会议”:“2021-01-17”}]

如果您想要update 声明:

update mytable t
inner join
    select id, json_arrayagg(json_object('meeting', x.meeting)) as new_col
    from mytable t
    cross join json_table (t.col, '$[*]' columns (meeting date path '$.meeting')) x
    where x.meeting > current_date
    group by id
) t1 on t1.id = t.id
set t.col = t1.new_col

【讨论】:

  • 我需要每天在同一列上运行它以删除过时的日期 - 所以对象必须保留在同一列中。
  • @user1621015:不,这需要 MySQL 8.0,如答案中所述。
  • @user1621015:如果您想要update 声明,请查看我的更新答案。
  • 有什么方法可以在 5.7 版中实现相同的功能 - 我无法更改数据库版本。
  • @user1621015:在 8.0 之前的版本中执行此类任务具有挑战性。
猜你喜欢
  • 1970-01-01
  • 2021-06-03
  • 1970-01-01
  • 2019-11-25
  • 2018-09-28
  • 1970-01-01
  • 1970-01-01
  • 2012-06-17
  • 2016-04-09
相关资源
最近更新 更多