我有一个 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/