- 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$;
- 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$
;
- 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
不能区分大小写,需要手动转换成特定的小写 才能获取到数据
- 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$;
如需转载 请注明本人。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于