Yoc*_*nan 5 mysql json mariadb
问题是关于MySQL/MariaDB JSON函数.
如何找到多个JSON结构的交集?
在PHP中,使用以下代码完成:
array_intersect(
['a', 'b'],
['b', 'c']
);
Run Code Online (Sandbox Code Playgroud)
如果我们想象一个名为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;
Run Code Online (Sandbox Code Playgroud)
看起来没有好的内置方法可以做到这一点,并且在这个主题上仍然没有好的答案,所以我想我应该添加我的快速和肮脏的解决方案。如果执行以下代码,它将创建一个名为 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$$
Run Code Online (Sandbox Code Playgroud)
然后您可以像这样调用该函数:
SELECT MY_JSON_INTERSECT('[1,2,3,4,5,6,7,8]','[0,3,5,7,9]');
Run Code Online (Sandbox Code Playgroud)
输出:
[3,5,7]
Run Code Online (Sandbox Code Playgroud)
这并不美观或高效,但它确实有效......希望很快就会有更好的答案。
| 归档时间: |
|
| 查看次数: |
835 次 |
| 最近记录: |