`
badqiu
  • 浏览: 674461 次
  • 性别: Icon_minigender_1
  • 来自: 珠海
社区版块
存档分类
最新评论

mysql map_get function,用于解析map结构数据,根据key返回相对应value

阅读更多

1.目的

mysql的列是固定的,不支持存储如Map 结构的数据,但现在我们的需求是希望有一个 ext Map的扩展列,可以存储Map结构的数据,并且可以在mysql里面进行运算.(即schema free)。所以解决方案是创建一个map_get()函数,可以根据key得到对应的value

函数功能:
/*
 * 用于解析map结构的数据,根据传入的inputKey返回相对应的value
 * 
 * @params
 * map: 自定义键值对的Map数据格式,输入例子: username:badqiu,age:25,sex:F
 * key: 输入key
 * @return 返回key对应的value,如果没有值,则返回null 
 */
map_get(map varchar2,key varchar2)
 


2.实现


set global log_bin_trust_function_creators = 1;

/*
 map_get(map,inputKey)函数
 用于解析map结构的数据,根据传入的inputKey返回相对应的value
*/

DROP FUNCTION IF EXISTS map_get;
DELIMITER $$    -- 定义函数分隔符,必须要有,可以不是$$
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 $$
DELIMITER;                                          

DROP FUNCTION IF EXISTS map_get_number;
DELIMITER $$    -- 定义函数分隔符,必须要有,可以不是$$
CREATE FUNCTION map_get_number( map varchar(5000), inputKey varchar(300) )
RETURNS DECIMAL
BEGIN
return cast(map_get(map,inputKey) AS DECIMAL );
END $$
DELIMITER;


 

3.测试

select map_get('username:badqiu','username')
union all
select map_get('username:badqiu,age:100','not exist')
union all
select map_get_number('username:badqiu,age:200','age')
union all
select map_get_number('username:badqiu,age:200','agexxxxx')
union all
select map_get('username:badqiu,age:100','age');
 


1
3
分享到:
评论

相关推荐

    mysql 解析json字符串

    mysql解析Json字符串插件 安装方法 1、拷贝lib_mysqludf_json_parsing.dll到mysql目录C:\Program Files\MariaDB 5.5\lib\plugin下 2、在数据库中执行 DROP FUNCTION json_get; CREATE FUNCTION json_get RETURNS ...

    嵌套Map或者List获取key、value值

    在编程中,尤其是在Java或类似的面向对象语言中,我们经常遇到需要处理复杂数据结构的情况,如嵌套的Map和List。这些数据结构可以提供灵活的方式来存储和操作数据,特别是当数据具有层次关系时。本篇将详细介绍如何...

    map(java).rar_ map ja_MAP JAVA_java map_java系统_map

    在Java中,`Map`是一个接口,它定义了键值对的数据结构,允许我们通过键来访问对应的值。这个项目可能是一个自定义的网络地图系统,利用Java的`Map`接口及其相关实现,如`HashMap`、`TreeMap`等,来存储和管理地理...

    MYSQL_C_API详解.pdf

    - `mysql_use_result()`:与`mysql_store_result()`相对应,用于处理大型结果集,可以分批检索数据,但需要更多的手动控制。 2. **MySQL C API结果集处理**: - `mysql_fetch_row()`:从结果集中获取下一行数据,...

    基于Python实现用于解析和转换 MySQL 二进制日志(binlog)的工具源码

    MySQL二进制日志(Binary Log,简称binlog)是MySQL数据库系统中记录所有更改数据库数据的事件序列的重要工具,主要用于数据恢复、主从复制等场景。本篇将深入探讨如何利用Python语言来解析和转换MySQL的binlog,...

    JSqlParser4.3版本作者补丁版用于解析mysql中JSON_OBJECT函数抛出ParseException异常

    用于JSqlParser4.3版本解析mysql中JSON_OBJECT函数抛出ParseException异常问题,如下: // this is true SELECT JSON_OBJECT(key person value account,key personName value account_name) obj FROM tb_review_...

    mysql-WINDOWS--SERVICES.zip_HTTP_HTTP协议_MYSQL_数据采集_采集

    为了将HTTP采集的数据存入MySQL,你需要确保数据库中存在对应的表,并且字段结构与采集数据相匹配。数据导入可以使用INSERT INTO语句,或者在大量数据情况下,考虑使用LOAD DATA INFILE语句,它能快速高效地批量插入...

    JAVA串口助手接收数据并解析数据存入MySQL数据库中

    在本文中,我们将深入探讨如何使用Java开发一个串口助手应用程序,该程序能接收来自串行端口的数据并将其解析后存储到MySQL数据库中。首先,我们需要了解串口通信的基本概念,然后学习Java如何处理串口输入,接着是...

    MySql 中查询树形结构的全部子项列表 Function

    本文将深入探讨如何在MySQL中查询树形结构的全部子项列表,结合提供的`MySql_Link_Function.sql`文件,我们将探讨一种有效的方法来实现这一功能。 首先,树形结构在数据库中的存储通常采用自引用的方式,即每个节点...

    Zabbix_Monitor_Mysql_Multiport-模本及脚本

    "userparameter_percona_mysql.conf"提供了自定义的数据采集,"ss_get_mysql_stats.php"和"get_mysql_stats_wrapper.sh"则负责数据的获取,而"mysql_low_discovery.sh"实现了服务的自动发现。"Mysql_Multiport_...

    读取properties文件返回map

    map.put(entry.getKey().toString(), entry.getValue().toString()); } ``` 5. **访问Map中的数据** 一旦转换成`Map`,你可以像操作任何其他`Map`一样操作它: ```java String username = map.get("username...

    Xml_2_Mysql.rar_XML mysql_mysql xml

    XML(eXtensible Markup Language)是一种用于标记数据的语言,常用于存储和传输结构化数据。MySQL则是一款流行的关系型数据库管理系统,广泛应用于网站和应用程序的数据存储。将XML数据转换为MySQL数据库是常见的...

    mysql数据表导出生成xml文件和树形结构

    MySQL 数据表导出生成 XML 文件是一项常见的数据转换任务,它允许我们把数据库中的结构化数据转化为一种便于交换和处理的格式。XML(eXtensible Markup Language)是一种标记语言,常用于存储、传输和表示数据,尤其...

    navicat112_mysql_cs_x64.tar.gz

    5. **同步工具**:用于比较和同步不同数据库之间的结构或数据,确保数据库的一致性。 6. **数据传输**:支持在不同数据库间进行数据和结构的迁移,支持批处理操作,节省时间。 7. **备份与恢复**:自动备份功能...

    mysql.rar_c语言mysql

    然后,`mysql_fetch_row()`函数用于逐行获取结果,而`mysql_num_rows()`返回结果集中行的数量。 4. 数据更新和删除:UPDATE和DELETE操作与SQL查询类似,只需构造相应的SQL语句,如"UPDATE table_name SET column1 =...

    ThinkPHP6.0以上兼容mysql下JSON_CONTAINS使用

    MySQL自5.7版本开始引入了对JSON数据类型的原生支持,这使得存储和查询结构化非关系型数据变得更加便捷。`JSON_CONTAINS`函数是MySQL提供的一种用于检查JSON文档中是否存在特定值的函数。它的基本语法是: ```sql ...

    Grafana 变量 KeyValue 形式实现.md

    Grafna Dashboard 中,... 常规实现没有问题,但对于下拉列表,最终用户一般要求看到的是 text 字段不是 value 字段,查询时则必须按 value 字段 这个问题,在Grafana 中有实现但需要进行设置 本方案解决上述的问题

    gkv:使用MySQL后端的Go(golang)极其简单的KeyValue存储

    它支持的唯一方法是Set(key, value) , Get(key)和Delete(key) ,其中key和value都是字符串。 用法示例 1.在您MySQL服务器上创建数据库表,例如: CREATE TABLE ` key_value_store ` ` key ` VARBINARY( 32 ) ...

Global site tag (gtag.js) - Google Analytics