实现一个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"');

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值