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

时间:2019-03-18 16:11:56

标签: 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 ...

=> dt:2019-03-18

我仍然无法测试该值。

2 个答案:

答案 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 <> ""

效果很好。