首页 > 解决方案 > Postgresql 列引用不明确

问题描述

我想调用我的函数,但出现此错误:

错误:列引用“列表”不明确第 3 行:SET list = ARRAY_APPEND(list, input_list2),

错误在 array_append 函数内的第二个列表中。

我的功能:

CREATE OR REPLACE FUNCTION update_order(input_id uuid,input_sku text,input_store_id uuid,input_order_date bigint,input_asin text,input_amount int,input_list text[],input_price real,input_list2 text) RETURNS void LANGUAGE plpgsql AS
$body$
#variable_conflict use_column
BEGIN
    INSERT INTO orders_summary(id,sku,store_id,order_date,asin,amount,list,price)
            VALUES(input_id,input_sku,input_store_id,to_timestamp(input_order_date / 1000.0),input_asin,input_amount,input_list,input_price) ON CONFLICT(sku,order_date) DO UPDATE
              SET list = ARRAY_APPEND(list, input_list2),
                  amount = amount + input_amount,
                  price = input_price
              WHERE NOT list @> input_list;
END
$body$;

标签: sqlpostgresql

解决方案


您必须在插入查询中使用别名,因为list有两个引用,一个引用 in EXCLUDED.list,另一个引用更新语句的列。

请检查以下查询(我os在查询中附加了带有名称的别名):

CREATE OR REPLACE FUNCTION update_order(input_id uuid,input_sku text,input_store_id uuid,input_order_date bigint,input_asin text,input_amount int,input_list text[],input_price real,input_list2 text) RETURNS void LANGUAGE plpgsql AS
$body$
#variable_conflict use_column
BEGIN
    INSERT INTO orders_summary as os (id,sku,store_id,order_date,asin,amount,list,price)
            VALUES(input_id,input_sku,input_store_id,to_timestamp(input_order_date / 1000.0),input_asin,input_amount,input_list,input_price) ON CONFLICT(sku,order_date) DO UPDATE
              SET list = ARRAY_APPEND(os.list, input_list2),
                  amount = os.amount + input_amount,
                  price = input_price
              WHERE NOT os.list @> input_list;
END
$body$;

或者您可以使用表名:

CREATE OR REPLACE FUNCTION update_order(input_id uuid,input_sku text,input_store_id uuid,input_order_date bigint,input_asin text,input_amount int,input_list text[],input_price real,input_list2 text) RETURNS void LANGUAGE plpgsql AS
$body$
#variable_conflict use_column
BEGIN
    INSERT INTO orders_summary (id,sku,store_id,order_date,asin,amount,list,price)
            VALUES(input_id,input_sku,input_store_id,to_timestamp(input_order_date / 1000.0),input_asin,input_amount,input_list,input_price) ON CONFLICT(sku,order_date) DO UPDATE
              SET list = ARRAY_APPEND(orders_summary.list, input_list2),
                  amount = orders_summary.amount + input_amount,
                  price = input_price
              WHERE NOT orders_summary.list @> input_list;
END
$body$;

推荐阅读