我有一个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 ...
=> dt:2019-03-18
我仍然无法测试该值。
答案 0 :(得分:1)
出于性能原因,应在插入时将数据提取到单独的列中。您想要做的方式非常慢。
但是,如果您必须这样做,请检查以下内容: 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以获取更多见识。
答案 1 :(得分:0)
使用 REGEXP_SUBSTR 和 HAVING 的解决方案:
SELECT
user_id,
REGEXP_SUBSTR(my_json_col, \'(?<=\{"i":41,"v":")(.*?)(?="\})\') AS dt
FROM mytable
HAVING
DATE(dt) < DATE(NOW())
and DATE(dt) > DATE("2019-03-15")
and dt <> ""
效果很好。