postgre 函数整理

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

  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 回帖

相关帖子

欢迎来到这里!

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

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

推荐标签 标签

  • Spark

    Spark 是 UC Berkeley AMP lab 所开源的类 Hadoop MapReduce 的通用并行框架。Spark 拥有 Hadoop MapReduce 所具有的优点;但不同于 MapReduce 的是 Job 中间输出结果可以保存在内存中,从而不再需要读写 HDFS,因此 Spark 能更好地适用于数据挖掘与机器学习等需要迭代的 MapReduce 的算法。

    74 引用 • 46 回帖 • 561 关注
  • Dubbo

    Dubbo 是一个分布式服务框架,致力于提供高性能和透明化的 RPC 远程服务调用方案,是 [阿里巴巴] SOA 服务化治理方案的核心框架,每天为 2,000+ 个服务提供 3,000,000,000+ 次访问量支持,并被广泛应用于阿里巴巴集团的各成员站点。

    60 引用 • 82 回帖 • 609 关注
  • IDEA

    IDEA 全称 IntelliJ IDEA,是一款 Java 语言开发的集成环境,在业界被公认为最好的 Java 开发工具之一。IDEA 是 JetBrains 公司的产品,这家公司总部位于捷克共和国的首都布拉格,开发人员以严谨著称的东欧程序员为主。

    180 引用 • 400 回帖 • 1 关注
  • Eclipse

    Eclipse 是一个开放源代码的、基于 Java 的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。

    75 引用 • 258 回帖 • 634 关注
  • 酷鸟浏览器

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

    3 引用 • 59 回帖 • 29 关注
  • Kubernetes

    Kubernetes 是 Google 开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。

    110 引用 • 54 回帖 • 2 关注
  • Flume

    Flume 是一套分布式的、可靠的,可用于有效地收集、聚合和搬运大量日志数据的服务架构。

    9 引用 • 6 回帖 • 625 关注
  • 脑图

    脑图又叫思维导图,是表达发散性思维的有效图形思维工具 ,它简单却又很有效,是一种实用性的思维工具。

    22 引用 • 70 回帖
  • Log4j

    Log4j 是 Apache 开源的一款使用广泛的 Java 日志组件。

    20 引用 • 18 回帖 • 32 关注
  • VirtualBox

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

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

    webpack 是一个用于前端开发的模块加载器和打包工具,它能把各种资源,例如 JS、CSS(less/sass)、图片等都作为模块来使用和处理。

    41 引用 • 130 回帖 • 261 关注
  • 分享

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

    246 引用 • 1786 回帖 • 1 关注
  • TGIF

    Thank God It's Friday! 感谢老天,总算到星期五啦!

    287 引用 • 4484 回帖 • 666 关注
  • 微软

    微软是一家美国跨国科技公司,也是世界 PC 软件开发的先导,由比尔·盖茨与保罗·艾伦创办于 1975 年,公司总部设立在华盛顿州的雷德蒙德(Redmond,邻近西雅图)。以研发、制造、授权和提供广泛的电脑软件服务业务为主。

    8 引用 • 44 回帖
  • SMTP

    SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。SMTP 协议属于 TCP/IP 协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。

    4 引用 • 18 回帖 • 624 关注
  • 前端

    前端技术一般分为前端设计和前端开发,前端设计可以理解为网站的视觉设计,前端开发则是网站的前台代码实现,包括 HTML、CSS 以及 JavaScript 等。

    247 引用 • 1347 回帖 • 1 关注
  • 生活

    生活是指人类生存过程中的各项活动的总和,范畴较广,一般指为幸福的意义而存在。生活实际上是对人生的一种诠释。生活包括人类在社会中与自己息息相关的日常活动和心理影射。

    230 引用 • 1454 回帖
  • Electron

    Electron 基于 Chromium 和 Node.js,让你可以使用 HTML、CSS 和 JavaScript 构建应用。它是一个由 GitHub 及众多贡献者组成的活跃社区共同维护的开源项目,兼容 Mac、Windows 和 Linux,它构建的应用可在这三个操作系统上面运行。

    15 引用 • 136 回帖 • 13 关注
  • GraphQL

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

    4 引用 • 3 回帖 • 18 关注
  • GitLab

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

    46 引用 • 72 回帖
  • Maven

    Maven 是基于项目对象模型(POM)、通过一小段描述信息来管理项目的构建、报告和文档的软件项目管理工具。

    186 引用 • 318 回帖 • 327 关注
  • PostgreSQL

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

    22 引用 • 22 回帖
  • Python

    Python 是一种面向对象、直译式电脑编程语言,具有近二十年的发展历史,成熟且稳定。它包含了一组完善而且容易理解的标准库,能够轻松完成很多常见的任务。它的语法简捷和清晰,尽量使用无异义的英语单词,与其它大多数程序设计语言使用大括号不一样,它使用缩进来定义语句块。

    540 引用 • 672 回帖
  • Swift

    Swift 是苹果于 2014 年 WWDC(苹果开发者大会)发布的开发语言,可与 Objective-C 共同运行于 Mac OS 和 iOS 平台,用于搭建基于苹果平台的应用程序。

    36 引用 • 37 回帖 • 527 关注
  • WebClipper

    Web Clipper 是一款浏览器剪藏扩展,它可以帮助你把网页内容剪藏到本地。

    3 引用 • 9 回帖 • 1 关注
  • ReactiveX

    ReactiveX 是一个专注于异步编程与控制可观察数据(或者事件)流的 API。它组合了观察者模式,迭代器模式和函数式编程的优秀思想。

    1 引用 • 2 回帖 • 148 关注
  • RYMCU

    RYMCU 致力于打造一个即严谨又活泼、专业又不失有趣,为数百万人服务的开源嵌入式知识学习交流平台。

    4 引用 • 6 回帖 • 51 关注