You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL/MariaDB中如何按JSON字段createdOn范围查询及删除数据?

解决JSON字段范围查询与删除问题

你之前的SQL错误在于不能把LIKE和BETWEEN这样混用,而且直接用字符串匹配JSON字段非常不可靠(比如JSON键值顺序变化就会失效)。正确的做法是利用数据库的JSON解析函数,提取createdOn字段后再做范围判断。

下面分主流数据库给出实现方案:

一、查询符合条件的记录

MySQL(5.7+支持JSON类型)

SELECT * 
FROM data 
WHERE JSON_UNQUOTE(JSON_EXTRACT(body, '$.createdOn')) BETWEEN '2018-10-05T00:00:00.000+0000' AND '2018-10-10T00:00:00.000+0000';

或者用更简洁的语法:

SELECT * 
FROM data 
WHERE body->>'$.createdOn' BETWEEN '2018-10-05T00:00:00.000+0000' AND '2018-10-10T00:00:00.000+0000';

PostgreSQL(9.3+支持JSON)

SELECT * 
FROM data 
WHERE (body->>'createdOn')::timestamp WITH TIME ZONE BETWEEN '2018-10-05T00:00:00.000+0000' AND '2018-10-10T00:00:00.000+0000';

SQL Server(2016+支持JSON)

SELECT * 
FROM data 
WHERE JSON_VALUE(body, '$.createdOn') BETWEEN '2018-10-05T00:00:00.000+0000' AND '2018-10-10T00:00:00.000+0000';

二、删除符合条件的记录

直接把上面的SELECT替换成DELETE即可,操作前务必先执行SELECT确认目标数据,避免误删:

MySQL

DELETE FROM data 
WHERE body->>'$.createdOn' BETWEEN '2018-10-05T00:00:00.000+0000' AND '2018-10-10T00:00:00.000+0000';

PostgreSQL

DELETE FROM data 
WHERE (body->>'createdOn')::timestamp WITH TIME ZONE BETWEEN '2018-10-05T00:00:00.000+0000' AND '2018-10-10T00:00:00.000+0000';

SQL Server

DELETE FROM data 
WHERE JSON_VALUE(body, '$.createdOn') BETWEEN '2018-10-05T00:00:00.000+0000' AND '2018-10-10T00:00:00.000+0000';

额外说明

  • 如果你的body列是普通字符串类型(不是数据库原生JSON类型),上面的函数依然可以正常解析,只要字符串格式是合法JSON。
  • 若需要先导出符合条件的记录再删除,可以先将SELECT结果导出为文件,再执行DELETE语句。

内容的提问来源于stack exchange,提问作者nee nee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 09:40:25