【发布时间】:2015-06-22 09:07:27
【问题描述】:
我一直在研究如何根据其他行的列的值替换单行的字符串子集,但由于更新仅适用于第一个,因此无法这样做另一个表的行值。所以我打算将它插入到 plpsql 函数的循环中。
这是我的表的 sn-p。主表:
Table "public.tbl_main"
Column | Type | Modifiers
-----------------------+--------+-----------
maptarget | text |
expression | text |
maptarget | expression
-----------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
43194-0 | 363787002:70434600=(386053000:704347000=(414237002:704320005=259470008,704318007=118539007,704319004=50863008),704327008=122592007,246501002=703690001,370132008=30766002)
查找表:
Table "public.tbl_values"
Column | Type | Modifiers
-----------------------+--------+-----------
conceptid | bigint |
term | text |
conceptid | term
-----------+------------------------------------------
386053000 | Patient evaluation procedure (procedure)
363787002 | Observable entity (observable entity)
704347000 | Observes (attribute)
704320005 | Towards (attribute)
704318007 | Property type (attribute)
我想创建一个函数,将tbl_main.expression 列中的所有数值替换为其对应的tbl_values.term,使用tbl_values.conceptid 作为表达式字符串中每个数值的链接。
我目前被困在循环部分,因为我是 plpgsql 的LOOP 的新手。这是我的函数的草稿。
--create first a test table
drop table if exists tbl_test;
create table tbl_test as select * from tbl_main limit 1;
--
create or replace function test ()
RETURNS SETOF tbl_main
LANGUAGE plpgsql
AS $function$
declare
resultItem tbl_main;
v_mapTarget text;
v_expression text;
ctr int;
begin
v_mapTarget:='';
v_expression:='';
ctr:=1;
for resultItem in (select * from tbl_test) loop
v_mapTarget:=resultItem.mapTarget;
select into v_expression expression from ee;
raise notice 'parameter used: %',v_mapTarget;
raise notice 'current expression: %',v_expression;
update ee set expression=replace(v_expression, new_exp::text, term) from (select new_exp::text, term from tbl_values offset ctr limit 1) b ;
ctr:=ctr+1;
raise notice 'counter: %', ctr;
v_expression:= (select expression from ee);
resultItem.expression:= v_expression;
raise notice 'current expression: %',v_expression;
return next resultItem;
end loop;
return;
end;
$function$;
任何进一步的信息将不胜感激。
我的 Postgres 版本:
x86_64-unknown-linux-gnu 上的 PostgreSQL 9.3.6,由 gcc (Ubuntu 4.8.2-19ubuntu1) 4.8.2, 64 位
【问题讨论】:
-
我没有 plpgsql 的经验,但我会做以下事情:创建一个临时表之类的东西,然后插入 tbl_main 的拆分值。比用你的 tbl_values 做一个简单的连接。如果您可以更改表格,我更愿意这样做。
-
为什么
conceptid386053000 是三次?我希望该专栏是独一无二的。另外,您的 Postgres 版本是什么?
标签: sql database postgresql function plpgsql