使用SQL计算JSON中的匹配数吗?

问题描述 投票:1回答:1

这是示例表:

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]', '$')

但是那只是找到具有匹配项的行,而不计算每行中的匹配项数:/

sql json mariadb mariadb-10.3
1个回答
0
投票

首先,information_schema.tables用于行生成,以便将索引值确定为JSON_EXTRACT()函数的第二个自变量,以及ROW_NUMBER()窗口函数(可用于DB 10.2+版本),并使用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

© www.soinside.com 2019 - 2024. All rights reserved.