本文地址: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

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

  1. navicat与phpmyadmin做mysql的自定义函数和事件

    自定义函数和事件是mysql一个很方便的功能,navicat在5.1以上版本就支持了自定义函数和事件,phpmyadmim不清楚. 用这个是由于一些简单的事情,没有必要去做一个服务器计划使用 接下来我 ...

  2. JS常用自定义函数总结

    JS常用自定义函数总结   1.原生JavaScript实现字符串长度截取 2.原生JavaScript获取域名主机 3.原生JavaScript清除空格 4.原生JavaScript替换全部 5.原 ...

  3. Mysql - 存储过程/自定义函数

    在数据库操作中, 尤其是碰到一些复杂一些的系统, 不可避免的, 会用到函数/自定义函数, 或者存储过程. 实际项目中, 自定义函数和存储过程是越少越好, 因为这个东西多了, 也是一个非常难以维护的地方 ...

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

    mysql创建自定义函数与存储过程 一 创建自定义函数 在使用mysql的过程中,mysql自带的函数可能不能完成我们的业务需求,这时就需要自定义函数,例如笔者在开发过程中遇到下面这个问题 mysql ...

  5. [转]MySQL常用Json函数和MySQL常用字符串函数

    MySQL常用Json函数:https://www.cnblogs.com/waterystone/p/5626098.html MySQL常用字符串函数:https://www.cnblogs.co ...

  6. MYSQL常用操作函数的封装

    1.mysql常用函数封装文件:mysql.func.php <?php /** * 连接MYSQL函数 * @param string $host * @param string $usern ...

  7. MySQL之MySQL常用的函数方法

    MySQL常用函数 本篇主要总结了一些在使用MySQL数据库中常用的函数,本篇大部分都是以实例作为讲解,如果有什么建议或者意见欢迎前来打扰. limit Select * from table ord ...

  8. MySQL(六) —— 自定义函数

    自定义函数 用户自定义函数(user-defined function, UDF)是一种对MySQL扩展的途径,其用法与内置函数相同. 参数,返回值 创建自定义函数 CREATE FUNCTION f ...

  9. MySQL之自定义函数

    引言 MySQL本身提供了内置函数,这些函数的存在给我们日常的开发和数据操作带来了很大的便利,比如我前面提到过的聚合函数SUM().AVG()以及日期时间函数等等,可是我们总会出现其他的需求:我们需要 ...

随机推荐

  1. 利用AOP写2PC框架(二)

    AOP的底层已经封装好了以后,我们就要开始针对应用层写具体的业务逻辑了. 也就是说我们需要有个类继承于AopProxyBase,并且重写其After,Bofore以达到我们的拦截记录的功能.代码如下: ...

  2. Spring Boot -- 启动彩蛋

    使用Spring Boot启动的jar包总是会显示一个Spring的图标: . ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\_ ...

  3. 微信小程序首次官方分享的纪要

    先交代备注: 这次有关小程序的分享只有技术的 QA环节,其他如产品.入口.流量.与公众号的整合等等,回答都是暂时无法给出答案或不确定: 小程序最终发布时间官方也还未确定,不过说应该就是近期: 小程序的 ...

  4. [Java定时器]用Spring Task实现一个简单的定时器.

    今天做一个项目的的时候需要用到定时器功能.具体需求是: 每个月一号触发一次某个类中的方法去拉取别人的接口获取上一个月份车险过期的用户.如若转载请附上原文链接:http://www.cnblogs.co ...

  5. 使用UICollectionView实现首页的滚动效果

    实现类似这样的效果,可以滚动大概有两种实现方案 1. 使用scrollview来实现 2. 使用UICollectionView来实现 第一种比较简单,而且相对于性能来说不太好,于是我们使用第二种方案 ...

  6. JSP实现word文档的上传,在线预览,下载

    前两天帮同学实现在线预览word文档中的内容,而且需要提供可以下载的链接!在网上找了好久,都没有什么可行的方法,只得用最笨的方法来实现了.希望得到各位大神的指教.下面我就具体谈谈自己的实现过程,总结一 ...

  7. 使用PowerShell 监控运行时间和连接情况

    概念 Powershell 是运行在windows机器上实现系统和应用程序管理自动化的命令行脚本环境.你可以把它看成是命令行提示符cmd.exe的扩充,不对,应当是颠覆. powershell需要.N ...

  8. LCM性质 + 组合数 - HDU 5407 CRB and Candies

    CRB and Candies Problem's Link Mean: 给定一个数n,求LCM(C(n,0),C(n,1),C(n,2)...C(n,n))的值,(n<=1e6). analy ...

  9. IOS学习之-私人通讯录

    通过一段时间IOS的学习完成了一个简单的应用,"私人通讯录". 运行效果如下图: 1.登录页 2.通讯录列表 3.添加 4.编辑 5.删除 6.注销 总视图结构如下图: 总结本程序 ...

  10. GridView的使用(高度封装,不怎么灵活,repeat可替代)

    GridView的使用 首先,gridview是封装好的,直接在设计界面使用,基本不需要写代码: 一.绑定数据源 GridView最好与LinQDatasourse配合使用,相匹配绑定数据: 二.样式 ...