2017-06-21 1253 views
4

问题是关于MySQL/MariaDB JSON Functions
如何找到多个JSON结构的交集?查找MySQL JSON对象或数组的交集

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; 
+0

请说明你的sql表的结构 – Dimgold

+0

@Dimgold没有表。这个问题已经更新了更多的细节。 – Yochanan

+0

我相信sql不解析数组,你需要设置一个函数来比较使用[regex]的数组字符串(https://stackoverflow.com/questions/9099469/mysql-select-like-or-re- regexp-to-match-multiple-单词记录)或[分隔符](https://stackoverflow.com/questions/3914199/split-strings-using-mysql) – Abra001

回答

0

它看起来没有内置的方式好
在PHP中使用此代码完成这样做的问题仍然没有很好的答案,所以我想我会添加我的快速&肮脏的解决方案。如果您执行下面的代码,它将创建一个名为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] 

这不是美丽或高效,但它的作品...希望更好的答案即将到来。