使用 SQL 计算 JSON 中的匹配数?
Posted
技术标签:
【中文标题】使用 SQL 计算 JSON 中的匹配数?【英文标题】:Using SQL to count number of matches in JSON? 【发布时间】:2020-09-11 18:21:10 【问题描述】:这是一个示例表:
id, json_txt
1, [5,18,23,50]
2, []
3, [4,5,12,18,22]
4, [18,22,50]
5, [3,12,70]
我想从其他行中的第 3 行的 json_txt
中获取匹配数的总和。
以下是每行的计数结果:
1 - 2 matches (5 and 18)
2 - 0 matches
3 - 5 matches (it's the row being searched for)
4 - 2 matches (18 and 22)
5 - 1 match (12)
据我所知:
SELECT * FROM my_table WHERE JSON_CONTAINS(json_txt, '[4,5,12,18,22]', '$')
但这只是找到匹配的行,而不是计算每行中的匹配数:/
【问题讨论】:
哪个版本的 mysql? @Nick 10.3.17-MariaDB-1:10.3.17+maria~xenial 【参考方案1】:首先,information_schema.tables
用于行生成,以便确定索引值作为JSON_EXTRACT()
函数的第二个参数以及可用于 DB 版本 10.2+ 的 ROW_NUMBER()
窗口函数,JSON_LENGTH()
函数是用于确定最大长度的数组,以便将每个数组中的每个元素与 id 值等于 3 的数组进行比较:
WITH t AS
(
SELECT t.id, JSON_EXTRACT(json_txt, CONCAT('$[', rn - 1, ']')) AS elm
FROM (SELECT ROW_NUMBER() OVER(ORDER BY 1) AS rn
FROM information_schema.tables) i
CROSS JOIN tab t
WHERE rn <= (SELECT MAX(JSON_LENGTH(json_txt)) FROM tab)
)
SELECT CONCAT( id,' - ',COUNT(id), ' matches ', GROUP_CONCAT(elm)) AS "Result"
FROM t
WHERE elm IN ( SELECT elm FROM t WHERE id = 3 )
GROUP BY id
Demo
【讨论】:
以上是关于使用 SQL 计算 JSON 中的匹配数?的主要内容,如果未能解决你的问题,请参考以下文章
使用带有 LINQ 的 JSON.NET 计算我的 JSON 文件中的子项数