【问题标题】:How to filter a JSON datatype in mysql based on property name?如何根据属性名称过滤 mysql 中的 JSON 数据类型?
【发布时间】:2018-05-08 13:31:25
【问题描述】:

我的 mysql 数据库中有一个名为“months”的 JSON 数据类型列。

这是一行的“月”样本值:{“2018Apr”:“2500”、“2018Jun”:“9000”、“2018May”:“4000”、“enddate”:“2018-06- 14T18:30:00.000Z", "开始日期": "2018-04-26T18:30:00.000Z"}。

“months”列的“enddate”和“startdate”以外的所有键都可以变化(即“startdate”和“enddate”将始终存在于 JSON 中)。我想运行一个选择查询来获取该列中的所有值,不包括“startdate”和“enddate”键及其值。

即选择查询的预期输出:- {"2500","9000", "4000"}

不幸的是,我能得到的最好结果是所有键的值导致:- {“2500”、“9000”、“4000”、“2018-06-14T18:30:00.000Z”、“2018-04-26T18:30:00.000Z”}

这是我使用的查询:-

SELECT `months` -> '$.*' 
  from `Project` 
 where `pId` ="6d43c24f-b258-4b75-8524-26873c643748" 
   AND `creationTime` IN (SELECT MAX(`creationTime`) FROM `Project` GROUP BY `id`);

MySql 文档包含基于 JSON 值而非键进行过滤的信息。非常感谢任何帮助。

【问题讨论】:

    标签: mysql json


    【解决方案1】:

    您可以使用JSON_REMOVEmonths 中删除startdateenddate 键,然后使用JSON_EXTRACT 获取剩余值:

    select json_extract(json_remove(months, '$.startdate', '$.enddate'), '$.*')
    from `Project` 
    where `pId` ="6d43c24f-b258-4b75-8524-26873c643748" 
    AND `creationTime` IN (SELECT MAX(`creationTime`) FROM `Project` GROUP BY `id`);
    

    应该给

    ["2500", "9000", "4000"]
    

    【讨论】:

    • 感谢尼克的帮助!
    • 没问题。一段时间以来,我一直在反对这些功能(通常只是对它们的局限性感到沮丧)
    猜你喜欢
    • 1970-01-01
    • 2020-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-03
    • 1970-01-01
    • 2021-10-19
    • 1970-01-01
    相关资源
    最近更新 更多