共享几个项目中用到的MySQL扩展函数

-- /*
--  * 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值