【问题标题】:SQL - SELECT WHERE date stored in a JSON varchar is greater or less than a fixed dateSQL - SELECT WHERE 存储在 JSON varchar 中的日期大于或小于固定日期
【发布时间】: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

标签: mysql sql json regex date


【解决方案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 了解更多信息。

    【讨论】:

      猜你喜欢
      • 2019-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多