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_SUBSTRHAVING 的解决方案:

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 中的日期大于或小于固定日期的主要内容,如果未能解决你的问题,请参考以下文章

在sql的where条件下怎么加判断语句?

Sql where 子句

sql 存储过程如何动态拼接where后面的条件

SQL Server存储过程:if variable = X,case where statement

SQL语句关于where判断问题

如何在objc中使用带有多个where值的select语句?