【问题标题】:I am getting the error subquery must return only one column when I try to run the following query:当我尝试运行以下查询时,我收到错误子查询必须只返回一列:
【发布时间】:2021-12-07 07:53:59
【问题描述】:
CREATE or REPLACE PROCEDURE checkUpdateAdd(imei1 inout text, assetName1 inout text)
language 'plpgsql'
AS $BODY$
declare
begin
    PERFORM * from msdata;
if (select * from msdata where imei = imei1) then
    --UPDATE "public"."msdata"
    UPDATE public.msdata SET assetname1 = assetname where imei = imei1;
    -- return assetname;
-- SELECT * FROM msdata ORDER BY imei ASC;
elseif (select * from msdata where imei != imei1) then
    Insert into public.msdata(imei,assetname) values (imei1,assetname1);
    --return;
end if;
    -- return (null,null);
end;
$BODY$;

call checkUpdateAdd('123','abc1');
SELECT * FROM msdata; 

其中msdata 是包含imeiassetname 列的现有表。

所以现在如果我必须创建一个在调用时创建或更新 msdata 的过程

【问题讨论】:

  • 你能请。解释你想达到什么目标?是不是如果imei1存在于表中,则返回与之关联的值,否则创建一条新记录(imei1,assetname1)?或者如果imei1存在则更新assetname?
  • imei 和assetnumber 是表中的列- ms 数据我想创建查询- 有2 个条件- 第一个是---> 如果imei = imei1 那么资产编号改变第二个是--->如果imei =! imei1 然后使用新的 imei 和资产编号创建新行
  • 我明白了。请参阅下面的答案。

标签: postgresql plpgsql psql pgadmin-4


【解决方案1】:

我宁愿创建一个函数来更新或插入并在更新时返回 assetname 字段的旧值或在插入时返回 null(因为没有旧值)。请注意FOUND 预定义变量。

CREATE or REPLACE FUNCTION checkUpdateAdd(imei1 text, assetName1 text)
returns text language plpgsql AS
$BODY$
declare
  retval text;
begin
  select assetname into retval from msdata where imei = imei1;
  if FOUND then -- (imei = imei1) exists, return the old assetname value
    update msdata SET assetname = assetname1 where imei = imei1;
    return retval;
  else
    insert into msdata(imei, assetname) values (imei1, assetname1);
    return null;
  end if;
end;
$BODY$;

顺便说一句。如果imei 是主键或者如果它有unique 约束,那么任务就变得简单多了。您可以使用insert on conflict do update,不需要函数或过程。

更新作为一个程序:

CREATE or REPLACE PROCEDURE checkUpdateAdd(imei1 text, assetName1 text) 
language plpgsql AS
$BODY$
begin
  if exists (select from msdata where imei = imei1) then
    update msdata SET assetname = assetname1 where imei = imei1;
  else
    insert into msdata(imei, assetname) values (imei1, assetname1);
  end if;
end;
$BODY$;

【讨论】:

  • 非常感谢。但不选择 PROCEDURE 的主要原因是什么?
  • 函数可以用在表达式中。好吧,或多或少也是个人喜好的问题。你接受答案吗?
  • 我将不得不添加一个过程或一个函数,因为我们最初需要逻辑,以便稍后我们可以上传.csv文件并且可以使用这个函数
  • 好点,封装和重用是有意义的。
  • 嗯,我完全同意你的个人喜好,但据说函数必须返回,但过程没有。我想知道如何在程序中实现它。
猜你喜欢
  • 2013-11-08
  • 2019-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-01
相关资源
最近更新 更多