【问题标题】:What is this "ERROR: ambiguous column reference error"?这是什么“错误:不明确的列引用错误”?
【发布时间】: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


【解决方案1】:

问题出在这里:

where id::varchar = code

因为ate_history 有一个名为code 的列并且您定义了一个变量code,因此表达式所指的变量不明确,因为两者都在范围内。 p>

通常你只需要限定它,但你不能只重命名它。

declare _code

_code := (select nullif(regexp_replace(r::varchar, '\D','','g'), ''));

where id::varchar = _code

或者如果你想要来自ate_history的专栏:

where id::varchar = a.code

【讨论】:

    猜你喜欢
    • 2015-01-07
    • 2018-07-02
    • 1970-01-01
    • 2018-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多