mysql 常用自定义函数解析

Posted 学而不思则罔,思而不学则殆

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql 常用自定义函数解析相关的知识,希望对你有一定的参考价值。

 


-- /*
--  * 用于获取一记录数据,根据传入的分隔字符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

 

以上是关于mysql 常用自定义函数解析的主要内容,如果未能解决你的问题,请参考以下文章

VSCode自定义代码片段——声明函数

VSCode自定义代码片段8——声明函数

Xcode自定义代码块

php 一个自定义的try..catch包装器代码片段,用于执行模型函数,使其成为一个单行函数调用

ios - Heroku 和 MongoDb 上的自定义解析服务器错误 3080:JSON 文本没有以数组或对象开头,并且允许未设置片段的选项

VSCode自定义代码片段——CSS选择器