查找 MySQL JSON 对象或数组的交集

Posted

技术标签:

【中文标题】查找 MySQL JSON 对象或数组的交集【英文标题】:Find intersection of MySQL JSON objects or arrays 【发布时间】:2017-11-25 01:15:55 【问题描述】:

问题是关于mysql/MariaDB JSON Functions。 如何找到多个 JSON 结构的交集? 在 php 中,它是使用以下代码完成的:

array_intersect(
    ['a', 'b'],
    ['b', 'c']
);

如果我们想象一个名为 JSON_INTERSECT 的函数,代码将如下所示:

SET @json1 = '"key1": "a", "key2": "b"';
SET @json2 = '["b", "c"]';
SET @json3 = '["c", "d"]';

SELECT JSON_INTERSECT(@json1, @json2); // returns '["b"]';
SELECT JSON_INTERSECT(@json1, @json3); // returns NULL;

【问题讨论】:

请解释一下你的sql表的结构 @Dimgold 没有表格。该问题已更新为更多详细信息。 我相信sql不会解析数组,你需要设置一个函数,使用regex或delimiters比较数组字符串 Feature was requested。观看和/或对问题进行投票,以了解其优先级。 【参考方案1】:

看起来没有好的内置方法可以做到这一点,并且关于这个主题仍然没有好的答案,所以我想我会添加我的快速和肮脏的解决方案。如果您执行以下代码,它将创建一个名为 MY_JSON_INTERSECT 的函数,该函数将完全按照原始海报指定的方式输出结果。在信任我的代码之前,请确保您已经查看过并且可以创建新函数:

delimiter $$
CREATE FUNCTION `MY_JSON_INTERSECT`(Array1 VARCHAR(1024), Array2 VARCHAR(1024)) RETURNS varchar(1024)
BEGIN
    DECLARE x int;
    DECLARE val, output varchar(1024);
    SET output = '[]';
    SET x = 0;
    IF JSON_LENGTH(Array2) < JSON_LENGTH(Array1) THEN
        SET val = Array2;
        SET Array2 = Array1;
        SET Array1 = val;
    END IF;
    WHILE x < JSON_LENGTH(Array1) DO
        SET val = JSON_EXTRACT(Array1, CONCAT('$[',x,']'));
        IF JSON_CONTAINS(Array2,val) THEN
            SET output = JSON_MERGE(output,val);
        END IF;
        SET x = x + 1; 
    END WHILE;
    IF JSON_LENGTH(output) = 0 THEN
        RETURN NULL;
    ELSE
        RETURN output;
    END IF;
END$$

然后你可以像这样调用函数:

SELECT MY_JSON_INTERSECT('[1,2,3,4,5,6,7,8]','[0,3,5,7,9]');

输出:

[3,5,7]

这既不美观也不高效,但它确实有效……希望很快会有更好的答案。

【讨论】:

以上是关于查找 MySQL JSON 对象或数组的交集的主要内容,如果未能解决你的问题,请参考以下文章

ES6数组:两个数组或数组对象取并集、交集、差集

PHP数组的几个操作,求并集,交集,差集,数组

JS数组操作(扁平化去重排序交集并集差集二分查找峰值位置)

java 求交集 并集 差集

求两个数组的交集

求两个数组的交集