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
时间: 2024-12-14 21:14:53

mysql 常用自定义函数解析的相关文章

MySQL常用字符函数简介

<html> <body> <h1>MySQL常用字符函数简介</h1> <table>     <tr>         <td>CONCAT(S1,S2...Sn)</td>         <td>连接S1,S2...Sn为一个字符串</td>     </tr> </table> <p style="background-color:yel

mysql创建自定义函数与存储过程

mysql创建自定义函数与存储过程 一 创建自定义函数 在使用mysql的过程中,mysql自带的函数可能不能完成我们的业务需求,这时就需要自定义函数,例如笔者在开发过程中遇到下面这个问题 mysql表结构如下 DROP TABLE IF EXISTS `test`; CREATE TABLE `test` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `pic` varchar(50) NOT NULL, `hashcode` varchar

mysql常用的函数

1.IF(expr1,expr2,expr3)函数: 如果 expr1 是TRUE ,则 IF()的返回值为expr2; 否则返回值则为 expr3. IF() 的返回值为数字值或字符串值,具体情况视其所在语境而定. 例: 2.IFNULL(expr1,expr2)函数: 如果expr1 不为 NULL,则 IFNULL() 的返回值为 expr1; 否则其返回值为 expr2. IFNULL()的返回值是数字或是字符串,具体情况取决于其所使用的语境. 3.CONCAT(str1,str2,..

MYSQL常用操作函数的封装

1.mysql常用函数封装文件:mysql.func.php <?php /** * 连接MYSQL函数 * @param string $host * @param string $username * @param string $password * @param string $dbName * @param string $charset * @return resource */ function connect($host,$username,$password,$dbName,$

MySQL之自定义函数与存储过程

MySQL数据库常用函数与自定义函数 1 SELECT ABS(-8);#绝对值 2 SELECT MOD(10,9); #取模 3 SELECT FLOOR(12.99); #地板 4 SELECT CEILING(10.01);#天花板 5 SELECT ROUND(12.99);#随机数,看第一个小数点数 6 SELECT CONCAT('i','love','java');#拼接 7 SELECT * FROM t_user t WHERE t.`uname` LIKE CONCAT('

MYSQL的自定义函数

自定义函数 用户自定义函数是一种对MYSQL扩展的途径,其用法与内置函数相同 函数可以返回任意类型的值,同样可以接收这些类型的参数 函数体由合法的SQL语句构成 函数体可以是简单的SELECT或INSERT语句 函数体如果为复合结构则使用BEGIN...END语句 复合结构可以包含声明,循环,复制结构 创建不带参数的自定义函数 第一步CREATE  FUNCTION  函数名 ()  FETURNS  字符串长度如VARCHAR(30) 第二步RETURN  类型(如DATE)_FORMAT 

mysql增加自定义函数功能

mysql默认是不能自定义函数的 当create function时 This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary solution 1: exec: SET GLOBAL log_bin_trust_function_creators = 1; mysql重启会失效 attention:mysql主从数据库配置,主从复制时,从机必须要设置,不然会导

MySQL 创建自定义函数(1)

1. 创建测试自定义函数(1) CREATE DEFINER=`dbdh`@`localhost` FUNCTION `test`.`sp_function_dbdh_three`() RETURNS varchar(255) CHARSET utf8BEGIN    DECLARE l_NEW_STR VARCHAR(255);  -- 定义变量    DECLARE l_NAYIBU_NUM1   INT;     SET l_NAYIBU_NUM1=101; IF (l_NAYIBU_NU

MySQL常用类型转换函数总结

MySQL函数,常用类型转换函数总结 1.Concat函数. 连接字符串常用:concat函数.如sql查询条件的like查询, AND c.name like concat(#{param.name},'%') 将Int 转为varchar经常用 concat函数,比如concat(8,'0') 得到字符串 '80' 2.Cast函数:CONVERT函数. 用法:CAST(expr AS type), CONVERT(expr,type) , CONVERT(expr USING transc