SQL - SELECT WHERE 存储在 JSON varchar 中的日期大于或小于固定日期
Posted
技术标签:
【中文标题】SQL - SELECT WHERE 存储在 JSON varchar 中的日期大于或小于固定日期【英文标题】:SQL - SELECT WHERE date stored in a JSON varchar is greater or less than a fixed date 【发布时间】:2019-08-09 01:45:16 【问题描述】:我有一个 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
我仍然无法测试该值。
【问题讨论】:
我将您对“上”/“下”的使用编辑为“大于”/“小于”。大写和小写通常是指大小写,而不是不等式。 您使用的是哪个 RDBMS:mysql、Oracle、SQL Server...?请在您的问题中添加相关标签。 谢谢比尔。我用 MySQL 【参考方案1】:使用 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 <> ""
效果很好。
【讨论】:
【参考方案2】:出于性能原因,您应该在插入时将数据提取到单独的列中。你想这样做的方式很慢。
但是,如果您必须这样做,请查看以下内容: 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 了解更多信息。
【讨论】:
以上是关于SQL - SELECT WHERE 存储在 JSON varchar 中的日期大于或小于固定日期的主要内容,如果未能解决你的问题,请参考以下文章