实现一个MySQL自定义函数:求两个JSONArray的并集

Posted PoetryAndTheDistance

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实现一个MySQL自定义函数:求两个JSONArray的并集相关的知识,希望对你有一定的参考价值。

目录

准备表及数据

创建自定义函数

删除自定义函数

测试自定义函数

函数中用到的其他的MySQL支持的JSON函数


准备表及数据

建表以及添加测试数据

/*
 Navicat Premium Data Transfer

 Source Server         : DataLab测试库
 Source Server Type    : mysql
 Source Server Version : 80015
 Source Host           : ******
 Source Schema         : analytics_graph_data

 Target Server Type    : MySQL
 Target Server Version : 80015
 File Encoding         : 65001

 Date: 26/05/2021 16:22:12
*/

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for TEST_JSON
-- ----------------------------
DROP TABLE IF EXISTS `TEST_JSON`;
CREATE TABLE `TEST_JSON`  (
  `huid` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增主键',
  `label` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '默认表名为主标签,此字段预留保存其它关联标签',
  PRIMARY KEY (`huid`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 439129120 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '保存担保网络中的实体' ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of TEST_JSON
-- ----------------------------
INSERT INTO `TEST_JSON` VALUES (438018543, '[\\"中国\\",\\"发债公司\\",\\"宁波\\",\\"发债公司\\"]');
INSERT INTO `TEST_JSON` VALUES (438018544, '[\\"上市公司\\",\\"上市公司\\",\\"发债公司\\",\\"发债公司\\"]');
INSERT INTO `TEST_JSON` VALUES (438018545, '[\\"宝塔\\",\\"上市公司\\",\\"上市公司\\",\\"上市公司\\"]');
INSERT INTO `TEST_JSON` VALUES (438018546, '[\\"国有独资有限责任公司\\",\\"国企\\",\\"地方国有企业\\"]');
INSERT INTO `TEST_JSON` VALUES (438018561, '');
INSERT INTO `TEST_JSON` VALUES (439129117, NULL);
INSERT INTO `TEST_JSON` VALUES (439129118, '[\\"国有独资有限责任公司\\",\\"国企\\",\\"地方国有企业\\"]123');
INSERT INTO `TEST_JSON` VALUES (439129119, '{\\"id\\": 1, \\"name\\": \\"mysql\\"}');

SET FOREIGN_KEY_CHECKS = 1;

 

创建自定义函数

#创建自定义函数
DELIMITER //
#自定义函数JSONArray_FilterValidValues:求两个JSONArray的并集
#定义入参param1(VARCHAR):需要过滤的JSONArray文档
#定义入参param2(VARCHAR):需要在文档中过滤出的有效值的JSONArray
#定义返回值result(VARCHAR):需要过滤的JSONArray文档中所包含的有效值的JSONArray)
CREATE FUNCTION JSONArray_FilterValidValues(JSON_ARRAY_Doc VARCHAR(512), JSON_ARRAY_ValidValues VARCHAR(512)) RETURNS VARCHAR(512)
BEGIN
	#定义变量:文档中所包含的有效值的JSONArray,初始默认值为:''
	DECLARE Doc_CONTAINS_ValidValues VARCHAR(512) DEFAULT '';
	#定义变量:WHILE循环中使用的下标,初始默认值为:0
	DECLARE i INT DEFAULT 0;
	#赋值:空的JSONArray的字符串
	SET Doc_CONTAINS_ValidValues = CONCAT(JSON_ARRAY(),'');
	#判断两个入参是否都是正确的JSON格式,以及JSON格式是否为JSONArray
	IF(JSON_VALID(JSON_ARRAY_Doc) = 1 && JSON_TYPE(JSON_ARRAY_Doc) = 'ARRAY' && JSON_VALID(JSON_ARRAY_ValidValues) = 1 && JSON_TYPE(JSON_ARRAY_ValidValues) = 'ARRAY')
	THEN
		#遍历有效值JSONArray中的每一个值是否在文档中
		WHILE(i < JSON_LENGTH(JSON_ARRAY_ValidValues)) DO
			BEGIN
				#如果文档中包含此下标的值
				IF(JSON_CONTAINS(JSON_ARRAY_Doc,JSON_EXTRACT(JSON_ARRAY_ValidValues,CONCAT('$[',i,']'))) = 1)
				THEN
					#则赋值:合并两个JSONArray
					SET Doc_CONTAINS_ValidValues = JSON_MERGE(Doc_CONTAINS_ValidValues,JSON_EXTRACT(JSON_ARRAY_ValidValues,CONCAT('$[',i,']')));
				END IF;
				#本次循环结束下标+1
				SET i=i+1;
			END;
		END WHILE;
	END IF;
	#遍历结束将最终的并集返回
	RETURN Doc_CONTAINS_ValidValues;
END;
//

 

删除自定义函数

#删除自定义函数
DROP FUNCTION JSONArray_FilterValidValues;

 

测试自定义函数

#测试自定义函数
SELECT JSONArray_FilterValidValues('["上市公司", "发债公司", "河南"]','["中国", "发债公司"]') as FilterValidValues;

#使用表数据测试自定义函数
SELECT huid,JSONArray_FilterValidValues(label, '["上市公司", "发债公司","国企"]') as 文档中所包含的有效值的JSONArray FROM TEST_JSON;

测试结果:

huid               并集

438018543    ["发债公司"]
438018544    ["上市公司", "发债公司"]
438018545    ["上市公司"]
438018546    ["国企"]
438018561    []
439129117    []
439129118    []
439129119    []

OK  完成

函数中用到的其他的MySQL支持的JSON函数

请参考:Mysql中的JSON函数使用教程

写这个自定义函数的过程中测试的其他JSON函数的用法的相关SQL:

SELECT huid,JSON_CONTAINS(label, '["发债公司"]') as 发债 FROM TEST_JSON;

SELECT huid,JSON_CONTAINS(label, '["上市公司"]') as 发债 FROM TEST_JSON;

SELECT huid,JSON_CONTAINS(label, '["发债公司","上市公司"]') as 发债 FROM TEST_JSON;

SELECT huid,JSON_SEARCH(label, 'ALL', '发债公司') as 发债 FROM TEST_JSON;

SELECT huid,JSON_SEARCH(label, 'ALL', '上市公司') as 发债 FROM TEST_JSON;

SELECT huid,JSON_SEARCH(label, 'one', '发债公司') as 发债 FROM TEST_JSON;

SELECT huid,JSON_SEARCH(label, 'one', '发债公司') as 发债 FROM TEST_JSON;

SELECT label->"$[0]" as 'tag' FROM `TEST_JSON`;

SELECT JSON_EXTRACT('["1", "2"]',CONCAT('$[',0,']'));

SELECT JSON_ARRAY('1','2');

SELECT JSON_ARRAY();

SELECT JSON_TYPE('["1", "2"]');

SELECT JSON_ARRAY_INSERT('["1", "2"]', '3');

SELECT JSON_MERGE('["1", "2"]', '"3"');

 

以上是关于实现一个MySQL自定义函数:求两个JSONArray的并集的主要内容,如果未能解决你的问题,请参考以下文章

自定义函数基础(内有实操)

自定义函数实现位操作

MYSQL 常见的内置函数与自定义函数

自定义函数multi()实现多个数求积

求一个javascript动画函数,用来交换两个元素位置

MySQL学习笔记-自定义函数