mysql 常用自定义函数解析
本文地址:http://www.cnblogs.com/qiaoyihang/p/6250684.html
-- /* -- * 用于获取一记录数据,根据传入的分隔字符delim,索引位置pos,返回相对应的value -- * SELECT Json_getKeyValue({"A":"2","B":"0","C":"1","D":"1"},'A');
-- */
DELIMITER $$ DROP FUNCTION IF EXISTS `Json_getKeyValue` $$ CREATE DEFINER=`root`@`%` FUNCTION `Json_getKeyValue`( in_JsonArray VARCHAR(4096), #JSON数组字符串 in_KeyName VARCHAR(64) #键名 ) RETURNS VARCHAR(512) CHARSET utf8 BEGIN DECLARE vs_return VARCHAR(4096); DECLARE vs_JsonArray, vs_Json, vs_KeyName VARCHAR(4096); DECLARE vi_pos1, vi_pos2 SMALLINT UNSIGNED; SET vs_JsonArray = TRIM(in_JsonArray); SET vs_KeyName = TRIM(in_KeyName); IF vs_JsonArray = '' OR vs_JsonArray IS NULL OR vs_KeyName = '' OR vs_KeyName IS NULL THEN SET vs_return = NULL; ELSE #去掉方括号 SET vs_JsonArray = REPLACE(REPLACE(vs_JsonArray, '[', ''), ']', ''); #取指定的JSON对象 SET vs_json = SUBSTRING_INDEX(vs_JsonArray,'}',-1); IF vs_json = '' OR vs_json IS NULL THEN SET vs_return = NULL; ELSE SET vs_KeyName = CONCAT('"', vs_KeyName, '":'); SET vi_pos1 = INSTR(vs_json, vs_KeyName); IF vi_pos1 > 0 THEN #如果键名存在 SET vi_pos1 = vi_pos1 + CHAR_LENGTH(vs_KeyName); SET vi_pos2 = LOCATE(',', vs_json, vi_pos1); IF vi_pos2 = 0 THEN #最后一个元素没有','分隔符,也没有结束符'}' SET vi_pos2 = CHAR_LENGTH(vs_json) + 1; END IF; SET vs_return = REPLACE(MID(vs_json, vi_pos1, vi_pos2 - vi_pos1), '"', ''); END IF; END IF; END IF; RETURN(vs_return); END$$ DELIMITER ;
-- /* -- * str_split(str,delim,pos)函数 -- * 用于获取一记录数据,根据传入的分隔字符delim,索引位置pos,返回相对应的value -- * 如:str_split("aa,bb,cc", ",", 1) 则返回aa -- */ DROP FUNCTION IF EXISTS str_split; CREATE FUNCTION str_split ( str VARCHAR(255), delim VARCHAR(12), pos INT ) RETURNS varchar(255) begin RETURN REPLACE(SUBSTRING(SUBSTRING_INDEX(str, delim, pos),LENGTH(SUBSTRING_INDEX(str,delim, pos -1)) + 1),delim,''); end
-- /* -- * get_distance(lng1,lat1,lng2,lat2)函数 -- * 根据地理两点的经纬度返回距离 -- */ DROP FUNCTION IF EXISTS get_distance; create FUNCTION get_distance ( lng1 DECIMAL(12,6), lat1 DECIMAL(12,6), lng2 DECIMAL(12,6), lat2 DECIMAL(12,6) ) RETURNS INT BEGIN RETURN round(6378.138*2*asin(sqrt(pow(sin( (lat1*pi()/180-lat2*pi()/180)/2),2)+cos(lat1*pi()/180)*cos(lat2*pi()/180)* pow(sin( (lng1*pi()/180-lng2*pi()/180)/2),2)))*1000); END
-- /* -- * map_get(map,inputKey)函数 -- * 用于解析map结构的数据,根据传入的inputKey返回相对应的value -- */ DROP FUNCTION IF EXISTS map_get; CREATE FUNCTION map_get( map varchar(5000), inputKey varchar(300) ) RETURNS VARCHAR(255) BEGIN DECLARE rowSeperator char(1) default ';'; -- 行分隔符 DECLARE fieldSeperator char(1) default '='; -- 键值对分隔符 DECLARE tempMap varchar(255) default map; DECLARE isEnd boolean default false; DECLARE rowIndex int default 0; DECLARE pair varchar(255); DECLARE pairIndex varchar(255); DECLARE strKey varchar(255); DECLARE strValue varchar(255); WHILE isEnd = false do set rowIndex = locate(rowSeperator,tempMap); if rowIndex > 0 then set pair = substring(tempMap,1,rowIndex-1); set tempMap = substring(tempMap,rowIndex+1,9999999); else set pair = tempMap; set isEnd = true; end if; set pairIndex = locate(fieldSeperator,pair); if pairIndex > 0 then set strKey = substring(pair,1,pairIndex-1); set strValue = substring(pair,pairIndex+1,9999999); if inputKey = strKey then return strValue; end if; end if; END WHILE; return null; END
-- /* -- * map_get_json(map,inputKey)函数 -- * 用于解析JSON目标结构的数据,根据传入的inputKey返回相对应的value -- * 一时没找到标准的解析JSON的自定义函数,就自己写了一个纯按字符串拆分获取的函数,记录数不是很大,json目标也不是很复杂,基本也可以用 -- */ DROP FUNCTION IF EXISTS map_get_json; CREATE FUNCTION map_get_json( map varchar(5000), inputKey varchar(300) ) RETURNS VARCHAR(255) BEGIN DECLARE rowSeperator char(1) default ','; -- 行分隔符 DECLARE fieldSeperator char(1) default ':'; -- 键值对分隔符 DECLARE tempMap varchar(1024) default map; DECLARE isEnd boolean default false; DECLARE rowIndex int default 0; DECLARE pair varchar(255); DECLARE pairIndex varchar(255); DECLARE strKey varchar(255); DECLARE strValue varchar(255); set tempMap = trim(map); set tempMap = replace(substring(tempMap, 2, length(tempMap)-2), '"', ''); WHILE isEnd = false do set rowIndex = locate(rowSeperator,tempMap); if rowIndex > 0 then set pair = substring(tempMap,1,rowIndex-1); set tempMap = substring(tempMap,rowIndex+1,9999999); else set pair = tempMap; set isEnd = true; end if; set pairIndex = locate(fieldSeperator,pair); if pairIndex > 0 then set strKey = trim(substring(pair,1,pairIndex-1)); set strValue = trim(substring(pair,pairIndex+1,9999999)); if inputKey = strKey then return trim(strValue); end if; end if; END WHILE; return null; END