[英]SQL - SELECT WHERE date stored in a JSON varchar is greater or less than a fixed 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
我仍然无法测试该值。
出于性能原因,应在插入时将数据提取到单独的列中。 您想要做的方式非常慢。
但是,如果必须这样做,请检查以下内容: 如何在MySQL中编写可解析列中JSON数据的查询?
它显示了如何直接处理数据,而不是使用正则表达式。 AFAIK适用于MySQL / Postgres,大多数RDBMS具有JSON功能,但我认为它不是非常标准化的,因此请查看适当的dox。
我认为您JSON_EXTRACT(column,'$[41].v')
,请查看https://dev.mysql.com/doc/refman/8.0/en/json-search-functions.html以获取更多信息。
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 <> ""
它运作良好。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.