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

8zzbczxx  于 5个月前  发布在  Mysql
关注(0)|答案(3)|浏览(66)

问题是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;

2eafrhcq

2eafrhcq1#

看起来没有很好的内置方法来做到这一点,并且仍然没有很好的答案,所以我想我应该添加我的快速而肮脏的解决方案。如果你执行下面的代码,它将创建一个名为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]


这并不漂亮或有效,但它是有效的......希望更好的答案很快就会出现。

xe55xuns

xe55xuns2#

JSON_TABLE自MySQL 8起可用,以下SQL可以生成两个json数组的交集:

SET @json2 = '["b", "c"]';
SET @json3 = '["c", "d"]';

SELECT DISTINCT t1.val
FROM
JSON_TABLE(@json2, '$[*]' COLUMNS(val VARCHAR(50) PATH '$')) t1
INNER JOIN JSON_TABLE(@json3, '$[*]' COLUMNS(val VARCHAR(50) PATH '$')) t2
ON t1.val = t2.val;

字符串
它将两个json数组解嵌套到两个临时表中,并通过相同值的内部连接返回交集。
但是当输入数组包含相同的元素(而不是集合)时,结果可能不会像预期的那样。基于预期,您可以根据需要更改DISTINCT部分。

lpwwtiir

lpwwtiir3#

MariaDB 11.2增加了JSON_ARRAY_INTERSECT,这似乎正是你正在寻找的。

SET @json1= '[1,2,3]';
SET @json2= '[1,2,4]';

SELECT json_array_intersect(@json1, @json2); 
+--------------------------------------+
| json_array_intersect(@json1, @json2) |
+--------------------------------------+
| [1, 2]                               |
+--------------------------------------+

字符串

相关问题