【发布时间】:2020-12-22 10:06:59
【问题描述】:
我想用我通过表 1 中的代码在表 2 中找到的值填充表 1 的空字段
CREATE OR REPLACE FUNCTION public.add_soate(
)
RETURNS SETOF zagsmarriagelist
LANGUAGE 'plpgsql'
COST 100
VOLATILE
ROWS 1000
AS $BODY$
DECLARE
r zagsmarriagelist%rowtype;
DECLARE code varchar;
BEGIN
FOR r IN
SELECT id FROM zagsmarriagelist
LOOP
code := (select nullif(regexp_replace(r::varchar, '\D','','g'), ''));
UPDATE zagsmarriagelist
SET bridesoate = (select substring(a.code from 1 for 14) from ate_history a where a.ate::varchar=(select bridebirthaddress from zagsmarriagelist where id::varchar=code))
WHERE id::varchar=code;
RETURN NEXT r;
END LOOP;
RETURN;
END
$BODY$;
ALTER FUNCTION public.add_soate()
OWNER TO postgres;
select * from add_soate();
显示错误:
错误:错误:对列“代码”的模糊引用第 2 行:... ess 从 zagsmarriagelist z where z.id::varchar = code)) as ... ^ DETAIL: 假定对 PL / pgSQL 变量或表列的引用。询问: UPDATE zagsmarriagelist SET Brisoate = (case when (select z.bridebirthaddress 来自 zagsmarriagelist z 其中 z.id::varchar = 代码)! = '' 然后从 ate_history a where a.ate :: varchar = (select z.bridebirthaddress 来自 zagsmarriagelist z where z.id::varchar = code)) as integer) else NULL END),groomsoate = (case when (select z.groombirthaddress from zagsmarriagelist z 其中 z.id::varchar = 代码)! = '' 然后转换 ((select substring (a.code from 1 for 14) from ate_history a where a.ate: : varchar = (select z.bridebirthaddress from zagsmarriagelist z 其中 z.id::varchar = 代码)) 作为整数) 否则为 NULL END) WHERE zagsmarriagelist.id::varchar=code CONTEXT: PL / pgSQL add_soate () 函数,第13行,语句SQL语句
为什么它不能识别子查询中的变量'code'?
【问题讨论】:
-
与手头的问题无关,但我认为您可以摆脱整个循环和复杂的子查询,并使用单个 UPDATE 语句编写。像这样的东西:pastebin.com/5v6xBW8R
-
我不确定你在 regexp_replace 背后的意图是什么,但我认为它来自对
r包含的内容的误解。你可能只想:code := r.id; -
天哪,我太笨了,我什至没有想过这个解决方案
标签: postgresql