postgre 函数整理

本贴最后更新于 1735 天前,其中的信息可能已经时异事殊

  1. phis2zx_number 返回 int8 类型的整型值,postgre 中最大的整型值为 numberic,返回值可设置为该类型
 /**
  * 处理异常数据
  * 比如 传入的值为'|||'
  */
CREATE OR REPLACE FUNCTION phis2zx_number(
	IN in_inputstr text					--	传入的原始字符串
)

 RETURNS int8
LANGUAGE plpgsql
AS $function$

/*
 * 函数说明:返回正常数字类型
 * 参数:按要求填写参数
 *  * 返回:累加值
*/
declare
	--	入参说明 '\\\','|||'
	--	程序变量说明
	v_result boolean default false;
begin
	
	----------------------------------------------------将异常全部处理掉----------------------------------------------------
	--需要匹配的字符串
	if(in_inputstr is null or in_inputstr = '')then 
		return 0;
	end if;
	--只匹配数字类型
	select in_inputstr ~* '\d+' into v_result;
	--未匹配到 默认回0
	if(v_result is false) then
		return 0;
	end if;
-----------------------------------------------------------------------------------------------------------------------
	--正常数据
	return  cast(substring(substring(in_inputstr from '\d+'),0,20) as numeric);
	
end

 $function$;

  1. phis2zx_split_part_plus 针对 split_part 函数封装 排除错误输入的 text 值
CREATE OR REPLACE FUNCTION phis2zx_split_part_plus(
	IN in_inputstr text,					--	传入的原始字符串
	IN in_matchregex varchar(64), --需要匹配的字符串 \u0001 \u0027  |
	in  in_subindex integer --需要匹配的下标值
)

 RETURNS TEXT
LANGUAGE plpgsql
AS $function$

/*
 * 函数说明:返回第一个下标或者第二个下标memo值
 * 参数:按要求填写参数
 *  * 返回:累加值
*/
declare
	--	入参说明 2\x01du\u0027le\u0027sou\u0027ru
	--	程序变量说明
	v_bizopt 	record;		--	选项记录集
	v_othertext TEXT DEFAULT '';
	v_matchcount int4 default 0;
begin
	
	--将异常全部处理掉
	--需要匹配的字符串
	if(in_inputstr is null or in_inputstr = '')then 
		if(in_subindex = 1) then 
			return 1;
		else
			return ''; --不匹配 直接返回空字符串(确实不知道是什么东西,有可能是垃圾数据)
		end if;
	end if;
	--没有需要匹配的 
	if(in_matchregex is null or in_matchregex = '')then 
		if(in_subindex = 1) then 
			return 1;
		else
			return ''; --不匹配 直接返回空字符串(确实不知道是什么东西,有可能是垃圾数据)
		end if;
	end if;

	--判断当前需要截取的字符串中是否包含需要匹配的字符串 且为匹配值为2
	select strpos(in_inputstr,in_matchregex) into 	v_matchcount;
	if(v_matchcount = 0 or v_matchcount <> 2)then 
		if(in_subindex = 1) then 
			return 1;
		else
			return ''; --不匹配 直接返回空字符串(确实不知道是什么东西,有可能是垃圾数据)
		end if;
	end if;
-----------------------------------------------------------------------------------------------------------------------
	--正常数据
	return split_part(in_inputstr,in_matchregex,in_subindex);

end

 $function$
;

  1. zx_transfer2zxfield 数据库 json 格式字段转换存储过程(特例)
 
/**
 * 該存儲過程對應數據庫兩個字段 分別是drugusage:用藥情況、drugguide:用藥指導(兩個字段使用的json格式一致) 外部需要傳遞0,1 加以區分 得到自己想要的字段
 */
CREATE OR REPLACE FUNCTION zx_transfer2zxfield (
	IN in_json_field jsonb,					--		选项JSON数组
	IN in_usagetype varchar(64)   --0用药情况,1用药指导
)

 RETURNS jsonb
LANGUAGE plpgsql
AS $function$

/*
 * 函数说明:將公衛用藥情況/用药指导的字段轉換為数据库字段(僅限用於JSON數組對象格式)
 * 参数:按要求填写参数
 *  in_json_field :
 *  [{"CmDrugID":"药物ID","Drugs":"药物名称","DailyTimes":"每日用药次数","EachDose":"每次用药剂量值","Remark":"每次用药剂量单位","Remark1":"用药备注","UsageType":"0用药情况,1用药指导"}]
 *  * 返回:累加值
 *  [{"drugfreq": "用藥頻率", "drugmemo": "藥物備注", "drugname": "藥物", "drugdosage": "藥物用量", "drugunitcode": "計量單位編碼", "drugunitname": "計量單位名稱"}]
*/
declare
	--	入参说明
	--	程序变量说明
	v_bizopt 	record;		--	选项记录集
	v_othertext TEXT DEFAULT '';
	v_rec           record;
	v_jsonb_array jsonb default '[]';
	v_json_field jsonb default null;
begin

	for v_rec in 
		 select 
		    drugs as drugname,
		 	dailytimes as drugfreq,
		 	eachdose as drugdosage,
		 	remark as drugunitname,
		 	'' as drugunitcode,
		 	remark1 as drugmemo,
		 	usagetype as drugtype  --0用药情况,1用药指导
		 from (select * from jsonb_to_recordset(phis61.phis2field_lower(in_json_field)) AS 
										t(
											cmdrugid varchar(64),  -- 药物ID
											drugs varchar(64),  -- 药物名称
											dailytimes varchar(64),  -- 每日用药次数
											eachdose varchar(64),  -- 每次用药剂量值
											remark varchar(64),  -- 每次用药剂量单位
											remark1 varchar(64),  -- 用药备注
											usagetype varchar(64) --0用药情况,1用药指导
										) where t.usagetype = in_usagetype
					) a	
	loop 
		select jsonb_build_object (
						'drugfreq', v_rec.drugfreq ,
						'drugmemo',v_rec.drugmemo,
						'drugname',v_rec.drugname,
						'drugdosage',v_rec.drugdosage,
						'drugunitcode',v_rec.drugunitcode,
						'drugunitname',v_rec.drugunitname
				) into v_json_field;
		select jsonb_insert (v_jsonb_array,'{0}',v_json_field, false) into v_jsonb_array; 
	end loop;

	RETURN v_jsonb_array;
end

 $function$;

这个函数需要注意的是:phis61.phis2field_lower() postgre 的 jsonb_to_recordset 不能区分大小写,需要手动转换成特定的小写 才能获取到数据

  1. phis2field_lower 转小写函数
/**
 * 本存储过程实现:
 * 将省公卫平台业务数据字段大小寫全部轉成小寫jsonb格式返回
 */
 
CREATE OR REPLACE FUNCTION phis2field_lower (
	IN in_jsonarray_field jsonb			--		省公卫平台json格式數組
)

 RETURNS jsonb
LANGUAGE plpgsql
AS $function$

/*
 * 函数说明:
 * 参数:按要求填写参数
 * in_jsonarray_field : 
 * 	[{"CmDrugID":"药物ID","Drugs":"药物名称","DailyTimes":"每日用药次数","EachDose":"每次用药剂量值","Remark":"每次用药剂量单位","Remark1":"用药备注","UsageType":"0用药情况,1用药指导"}]
 * 
 *  * 返回:平台统一格式的uuid(32位小写字符,无中间连字符)
*/
declare
	--	入参说明
	--	程序变量说明
	v_text text default '';
begin
	
	v_text := (in_jsonarray_field)::text;

	--	如果选项无值,则直接返回 0
	IF (v_text IS NULL OR trim(v_text) = '' ) THEN
		return -6;
	END IF;

	return (lower(replace (trim(v_text), '-', '')))::jsonb;
end

 $function$;


如需转载 请注明本人。

  • PostgreSQL

    PostgreSQL 是一款功能强大的企业级数据库系统,在 BSD 开源许可证下发布。

    22 引用 • 22 回帖 • 2 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • GraphQL

    GraphQL 是一个用于 API 的查询语言,是一个使用基于类型系统来执行查询的服务端运行时(类型系统由你的数据定义)。GraphQL 并没有和任何特定数据库或者存储引擎绑定,而是依靠你现有的代码和数据支撑。

    4 引用 • 3 回帖 • 18 关注
  • 创造

    你创造的作品可能会帮助到很多人,如果是开源项目的话就更赞了!

    175 引用 • 994 回帖
  • HHKB

    HHKB 是富士通的 Happy Hacking 系列电容键盘。电容键盘即无接点静电电容式键盘(Capacitive Keyboard)。

    5 引用 • 74 回帖 • 450 关注
  • Hibernate

    Hibernate 是一个开放源代码的对象关系映射框架,它对 JDBC 进行了非常轻量级的对象封装,使得 Java 程序员可以随心所欲的使用对象编程思维来操纵数据库。

    39 引用 • 103 回帖 • 709 关注
  • 阿里巴巴

    阿里巴巴网络技术有限公司(简称:阿里巴巴集团)是以曾担任英语教师的马云为首的 18 人,于 1999 年在中国杭州创立,他们相信互联网能够创造公平的竞争环境,让小企业通过创新与科技扩展业务,并在参与国内或全球市场竞争时处于更有利的位置。

    43 引用 • 221 回帖 • 158 关注
  • MongoDB

    MongoDB(来自于英文单词“Humongous”,中文含义为“庞大”)是一个基于分布式文件存储的数据库,由 C++ 语言编写。旨在为应用提供可扩展的高性能数据存储解决方案。MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似 JSON 的 BSON 格式,因此可以存储比较复杂的数据类型。

    90 引用 • 59 回帖 • 9 关注
  • Unity

    Unity 是由 Unity Technologies 开发的一个让开发者可以轻松创建诸如 2D、3D 多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

    25 引用 • 7 回帖 • 203 关注
  • 国际化

    i18n(其来源是英文单词 internationalization 的首末字符 i 和 n,18 为中间的字符数)是“国际化”的简称。对程序来说,国际化是指在不修改代码的情况下,能根据不同语言及地区显示相应的界面。

    8 引用 • 26 回帖 • 2 关注
  • DevOps

    DevOps(Development 和 Operations 的组合词)是一组过程、方法与系统的统称,用于促进开发(应用程序/软件工程)、技术运营和质量保障(QA)部门之间的沟通、协作与整合。

    45 引用 • 25 回帖 • 1 关注
  • Rust

    Rust 是一门赋予每个人构建可靠且高效软件能力的语言。Rust 由 Mozilla 开发,最早发布于 2014 年 9 月。

    58 引用 • 22 回帖 • 4 关注
  • MyBatis

    MyBatis 本是 Apache 软件基金会 的一个开源项目 iBatis,2010 年这个项目由 Apache 软件基金会迁移到了 google code,并且改名为 MyBatis ,2013 年 11 月再次迁移到了 GitHub。

    170 引用 • 414 回帖 • 394 关注
  • 酷鸟浏览器

    安全 · 稳定 · 快速
    为跨境从业人员提供专业的跨境浏览器

    3 引用 • 59 回帖 • 26 关注
  • VirtualBox

    VirtualBox 是一款开源虚拟机软件,最早由德国 Innotek 公司开发,由 Sun Microsystems 公司出品的软件,使用 Qt 编写,在 Sun 被 Oracle 收购后正式更名成 Oracle VM VirtualBox。

    10 引用 • 2 回帖 • 16 关注
  • ZooKeeper

    ZooKeeper 是一个分布式的,开放源码的分布式应用程序协调服务,是 Google 的 Chubby 一个开源的实现,是 Hadoop 和 HBase 的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。

    59 引用 • 29 回帖 • 7 关注
  • 正则表达式

    正则表达式(Regular Expression)使用单个字符串来描述、匹配一系列遵循某个句法规则的字符串。

    31 引用 • 94 回帖
  • CentOS

    CentOS(Community Enterprise Operating System)是 Linux 发行版之一,它是来自于 Red Hat Enterprise Linux 依照开放源代码规定释出的源代码所编译而成。由于出自同样的源代码,因此有些要求高度稳定的服务器以 CentOS 替代商业版的 Red Hat Enterprise Linux 使用。两者的不同在于 CentOS 并不包含封闭源代码软件。

    238 引用 • 224 回帖
  • 京东

    京东是中国最大的自营式电商企业,2015 年第一季度在中国自营式 B2C 电商市场的占有率为 56.3%。2014 年 5 月,京东在美国纳斯达克证券交易所正式挂牌上市(股票代码:JD),是中国第一个成功赴美上市的大型综合型电商平台,与腾讯、百度等中国互联网巨头共同跻身全球前十大互联网公司排行榜。

    14 引用 • 102 回帖 • 390 关注
  • 强迫症

    强迫症(OCD)属于焦虑障碍的一种类型,是一组以强迫思维和强迫行为为主要临床表现的神经精神疾病,其特点为有意识的强迫和反强迫并存,一些毫无意义、甚至违背自己意愿的想法或冲动反反复复侵入患者的日常生活。

    15 引用 • 161 回帖
  • AngularJS

    AngularJS 诞生于 2009 年,由 Misko Hevery 等人创建,后为 Google 所收购。是一款优秀的前端 JS 框架,已经被用于 Google 的多款产品当中。AngularJS 有着诸多特性,最为核心的是:MVC、模块化、自动化双向数据绑定、语义化标签、依赖注入等。2.0 版本后已经改名为 Angular。

    12 引用 • 50 回帖 • 466 关注
  • Git

    Git 是 Linux Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。

    207 引用 • 358 回帖
  • 笔记

    好记性不如烂笔头。

    308 引用 • 793 回帖
  • 设计模式

    设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。

    198 引用 • 120 回帖 • 1 关注
  • Ngui

    Ngui 是一个 GUI 的排版显示引擎和跨平台的 GUI 应用程序开发框架,基于
    Node.js / OpenGL。目标是在此基础上开发 GUI 应用程序可拥有开发 WEB 应用般简单与速度同时兼顾 Native 应用程序的性能与体验。

    7 引用 • 9 回帖 • 376 关注
  • 分享

    有什么新发现就分享给大家吧!

    246 引用 • 1786 回帖
  • Vim

    Vim 是类 UNIX 系统文本编辑器 Vi 的加强版本,加入了更多特性来帮助编辑源代码。Vim 的部分增强功能包括文件比较(vimdiff)、语法高亮、全面的帮助系统、本地脚本(Vimscript)和便于选择的可视化模式。

    28 引用 • 66 回帖
  • 单点登录

    单点登录(Single Sign On)是目前比较流行的企业业务整合的解决方案之一。SSO 的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。

    9 引用 • 25 回帖 • 2 关注
  • GitLab

    GitLab 是利用 Ruby 一个开源的版本管理系统,实现一个自托管的 Git 项目仓库,可通过 Web 界面操作公开或私有项目。

    46 引用 • 72 回帖