实现一个MySQL自定义函数:求两个JSONArray的并集
Posted PoetryAndTheDistance
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实现一个MySQL自定义函数:求两个JSONArray的并集相关的知识,希望对你有一定的参考价值。
目录
准备表及数据
建表以及添加测试数据
/*
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函数
写这个自定义函数的过程中测试的其他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的并集的主要内容,如果未能解决你的问题,请参考以下文章