如何在 SQL 上的 JSON 数组中搜索
How to search through in JSON array on SQL
我正在使用 MySQL 5.6.43 并尝试在 table 中的 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
}
]
我想拿 AFG
CountryCode
的。所以我的结果应该是这样的:
[
{
"Name": "AAA",
"CountryCode": "AFG",
"District": "Kabol",
"Population": 1780000
},
{
"Name": "BBB",
"CountryCode": "AFG",
"District": "Qandahar",
"Population": 237500
}
]
我怎样才能做到这一点?
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;
在 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
如果源数组的每个值可能包含超过 4 个对象,则展开 nums
子查询。
限制:要搜索的键和值都不能包含 space.
我正在使用 MySQL 5.6.43 并尝试在 table 中的 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
}
]
我想拿 AFG
CountryCode
的。所以我的结果应该是这样的:
[
{
"Name": "AAA",
"CountryCode": "AFG",
"District": "Kabol",
"Population": 1780000
},
{
"Name": "BBB",
"CountryCode": "AFG",
"District": "Qandahar",
"Population": 237500
}
]
我怎样才能做到这一点?
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;
在 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
如果源数组的每个值可能包含超过 4 个对象,则展开 nums
子查询。
限制:要搜索的键和值都不能包含 space.