【问题标题】:How to search through in JSON array on SQL如何在 SQL 上的 JSON 数组中进行搜索
【发布时间】:2020-10-08 10:51:31
【问题描述】:

我正在使用 MySQL 5.6.43 并尝试在表中的 JSON 数组中进行搜索。我在 MySQL 数据库中的 JSON 是这样的:

[
    {
        "Name": "AAA",
        "CountryCode": "AFG",
        "District": "Kabol",
        "Population": 1780000
    },
    {
        "Name": "BBB",
        "CountryCode": "AFG",
        "District": "Qandahar",
        "Population": 237500
    },
    {
        "Name": "CCC",
        "CountryCode": "USD",
        "District": "Qandahar",
        "Population": 237500
    }
]

我想拿刚刚AFGCountryCode的。所以我的结果应该是这样的:

[
    {
        "Name": "AAA",
        "CountryCode": "AFG",
        "District": "Kabol",
        "Population": 1780000
    },
    {
        "Name": "BBB",
        "CountryCode": "AFG",
        "District": "Qandahar",
        "Population": 237500
    }
]

我怎样才能做到这一点?

【问题讨论】:

  • 解析对象数组以分离对象(使用 JSON_TABLE() 函数),检查每个对象的属性,然后聚合匹配的对象。
  • @Akina 感谢您的回复。能不能通过代码解释一下?

标签: mysql sql json mysql-5.6


【解决方案1】:
SELECT test.data, JSON_ARRAYAGG(JSON_OBJECT('Name',jsontable.Name,
                                            'CountryCode',jsontable.CountryCode,
                                            'District',jsontable.District,
                                            'Population',jsontable.Population)) filtered
FROM test,
     JSON_TABLE(test.data,
                '$[*]' COLUMNS (Name VARCHAR(255) PATH '$.Name',
                                CountryCode VARCHAR(255) PATH '$.CountryCode',
                                District VARCHAR(255) PATH '$.District',
                                Population VARCHAR(255) PATH '$.Population')) jsontable
WHERE jsontable.CountryCode = 'AFG'
GROUP BY test.data;

fiddle

在 MySQL 5.6 中,您必须使用字符串函数 - 此版本中尚未实现 JSON:

SELECT CONCAT('[', GROUP_CONCAT('{', SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(test.data, '}', nums.num), '}', -1), '{', -1), '}'), ']') filtered
FROM test
CROSS JOIN (SELECT 1 num UNION SELECT 2 UNION SELECT 3 UNION SELECT 4) nums
WHERE LOCATE('"CountryCode":"AFG"', SUBSTRING_INDEX(SUBSTRING_INDEX(REPLACE(test.data, ' ', ''), '}', nums.num), '}', -1))
GROUP BY test.data

fiddle

如果源数组的每个值可能包含超过 4 个对象,则展开 nums 子查询。

限制:要搜索的键和值都不能包含空格。

【讨论】:

  • 对 MySQL 有效吗?
  • @sundowatch 你看到小提琴的链接了吗?它在 MySQL 8.0.21 中成功执行。但是,如果版本太旧,那么它将无法工作 - JSON_TABLE 是在 8.0.4 中实现的。
  • 嗯,好的。我正在使用 5.6.43。有什么类似的吗?
  • @sundowatch 对于这个版本,您必须使用通用字符串函数。
  • 您的意思是LIKE 还是任何其他常见的字符串函数?
猜你喜欢
  • 1970-01-01
  • 2021-12-01
  • 2021-11-02
  • 2021-03-07
  • 1970-01-01
  • 2020-02-01
  • 2018-04-24
  • 1970-01-01
相关资源
最近更新 更多