• 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
  • 相关阅读:
    【转】[完结] 取结构偏移 和 取地址符号的 思考
    资料备忘 【攀枝花】 我的百度文库
    static_cast reinterprt_cast 区别
    c++ 四种转换 cast 列表小结 (等待补充)2012 3月
    对偏移表达式的 思考过程—how offset macro is think out
    【转】常见面试题思想方法整理 原来果然有双指针遍历
    [转]好的习惯 提高你开发效率的十五个Visual Studio 2010使用技巧
    多种方案 测试 有无符号数包括 不适用大小于符号判断符号数
    [转] 仅有USB线拷贝无SD卡小米照相文件方法 简言adb shell
    iframe 高度自动调节
  • 原文地址:https://www.cnblogs.com/qiaoyihang/p/6250684.html
Copyright © 2020-2023  润新知