首页 > 解决方案 > Postgres,函数,在插入 vladate 数组值之前

问题描述

这是我的功能`

create or replace function test.insert(_orderid integer, __partnerids      
integer[], __maginitude double precision[])
returns boolean
language plpgsql
as $$
DECLARE  res boolean;
BEGIN
PERFORM orderid
FROM test.order_partner_magnitude
WHERE orderid = _orderid
FOR UPDATE SKIP LOCKED;

DELETE
FROM test.order_partner_magnitude
WHERE orderid = _orderId;

INSERT INTO test.order_partner_magnitude(orderid, partnerid, magnitude)
SELECT _orderId, unnest(__partnerids),unnest(__maginitude);

res =true ;
RETURN res;
end ;
$$;

一些使用示例SELECT test.insert(1, '{30,10,20}','{46,59,12}');结果将是

orderid | partnerid | magnitude
      1 |        30 |        46
      1 |        10 |        59
      1 |        20 |        12

现在我需要检查合作伙伴是否忙碌,我可以通过此查询获取忙碌的合作伙伴 ID SELECT partnerid from test.order_partner WHERE status = 1

插入结果必须为 ` 后,ID 为 20 的示例伙伴正忙

orderid | partnerid | magnitude
      1 |        30 |        46
      1 |        10 |        59

我想用 1 个插入查询插入所有数据,比如在函数中,所以不能partnerid从参数循环,还有其他方法吗?如果没有办法,我可以更改数据类型、示例[[partnerid, magnitude],[partnerid, magnitude]......]或任何其他类型的女巫将有助于解决这个问题。

标签: sqlpostgresql

解决方案


在一个查询中可行,例如:

db=# with c(o, p, m) as (values (1, '{30,10,20}'::int[],'{46,59,12}'::int[]))
, op(i, status) as (values(20,1))
, mypart as (select o, unnest(p) pa, unnest(m) me from c)
select mypart.*
from mypart
left outer join op on i = pa
where i is null;
 o | pa | me
---+----+----
 1 | 30 | 46
 1 | 10 | 59
(2 rows)

所以对你来说:

INSERT INTO test.order_partner_magnitude(orderid, partnerid, magnitude)
with c(o, p, m) as (values (_orderId, __partnerids, __maginitude))
    , mypart as (select o, unnest(p) pa, unnest(m) me from c)
    select mypart.*
    from mypart
    left outer join test.order_partner on partner_id = pa
    where i is null;

推荐阅读