`
badqiu
  • 浏览: 673530 次
  • 性别: 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
分享到:
评论

相关推荐

    嵌套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()`:从结果集中获取下一行数据,...

    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_...

    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_MYSQL_

    MySQL是世界上最受欢迎的关系型数据库管理系统(RDBMS)之一,尤其在Web应用程序中广泛使用。本文将深入探讨MySQL中的查询、更新和其他相关语句,帮助你更好地理解和掌握MySQL数据库操作。 1. **基本查询语句**: ...

    mysql.rar_c语言mysql

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

    Grafana 变量 KeyValue 形式实现.md

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

    shell_config.rar_Linux shell_parsing shell_shell config_get_sh

    标题"shell_config.rar_Linux shell_parsing shell_shell config_get_sh"暗示了我们要讨论的是如何使用Shell脚本来解析配置文件并获取其中的变量参数。这个过程在系统管理、应用程序自动化或者脚本编程中非常常见。 ...

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

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

    读取properties文件返回map

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

    MYSQL的C的API实例讲解

    `MYSQL_DATA`和`MYSQL_ROWS`是内部使用的结构,用于管理结果集的内存分配和数据访问。 从`MYSQL_RES`中提取数据通常涉及以下步骤: 1. 使用`mysql_use_result`函数缓冲查询结果。 2. 通过`mysql_fetch_field`获取列...

Global site tag (gtag.js) - Google Analytics