mysql - SQL - SELECT WHERE 存储在 JSON varchar 中的日期大于或小于固定日期

标签 mysql sql json regex date

我有一个 VARCHAR 列,用户可以在其中存储来自输入、选择、复选框和输入类型日期的自定义数据。

[{"i":24,"v":[0,1,4]},{"i":26,"v":[2,3,6,10]},{"i":41,"v":"2019-03-18"},{"i":27,"v":[26]},{"i":6,"v":"Very happy to be here."},{"i":13,"v":4},{"i":22,"v":9},{"i":3,"v":"Numerous"},{"i":4,"v":3},{"i":29,"v":[2,3]},{"i":30,"v":[3,4]}]

我知道 ID 41 是一个日期。如果 ID 41 存在并且数据大于固定日期,我想选择此用户。

我的想法是使用 REGEXP 来测试 ID 41 是否存在:REGEXP\'(\{"i":41,) 然后捕获日期并测试它(TO_DATE ?)。 我该如何完成第二部分?

编辑 - 我找到了一个使用 REGEXP_SUBSTR 捕获日期的解决方案:

SELECT user_id, REGEXP_SUBSTR(my_json_col, \'(?<=\{"i":41,"v":")(.*?)(?="\})\') AS dt FROM ...

=> 发布时间:2019-03-18

我仍然无法测试该值。

最佳答案

出于性能原因,您应该在插入时将数据提取到单独的列中。你想要的方式非常慢。

但是,如果您必须这样做,请查看以下内容: How can write queries in MySQL that can parse JSON data in a column?

它向您展示了如何直接寻址数据,而不是使用正则表达式。 AFAIK 这适用于 MySQL/Postgres,大多数 RDBMS 都有 JSON 功能,但我认为它不是很标准化,所以请查看相应的 dox。

我认为 JSON_EXTRACT(column,'$[41].v') 就是您想要的,请检查 https://dev.mysql.com/doc/refman/8.0/en/json-search-functions.html以获得更多见解。

关于mysql - SQL - SELECT WHERE 存储在 JSON varchar 中的日期大于或小于固定日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55225629/

相关文章:

mysql - 对于弱实体和它所依赖的强实体之间的关系我们能说什么呢?

sql - 检查项目是否存在的最佳方法是 : Select Count(ID)OR Exist(. ..)?

ios - 如何在 Swift 中从 JSON 数组中删除项目(使用 SwiftyJSON)

ios - 将 tableview 选定的数据存储到带有键值的数组中

javascript - JSON.parse 没有预期的行为

mysql - Visual Basic 数据库登录 - 代码不起作用

mysql - GROUP BY 导致 ORDER BY 不起作用

php - 创建干净的 HABTM 查询

php - 带有 join 子句和 group by 子句的 mysql 查询

php - SQL : Match IN operator with anything