创建存储过程(int [] as param),当int数组中没有匹配时删除表中的现有记录

问题描述 投票:3回答:2

例如:如果我已经将1,2,3参数发送到带有idxyz的存储过程,那么表有1,2,3,4,5个ID,那么应该从表中删除4,5。

 CREATE OR REPLACE FUNCTION example_array_input(INT[]) RETURNS SETOF ids AS
$BODY$
DECLARE
        in_clause ALIAS FOR $1;
        clause  TEXT;
        rec     RECORD;
BEGIN
        FOR rec IN SELECT id FROM ids WHERE id = ANY(in_clause)

        LOOP
                RETURN NEXT rec;
        END LOOP;
        -- final return
        RETURN;
END
$BODY$ language plpgsql;

ex: SELECT * FROM example_array_input('{1,2,4,5,6}'::INT[]);

如果现有表有1,2,3,4,5,6,7,8,9。然后它应该从该表中删除7,8,9,因为它们不在输入数组中

sql postgresql postgresql-9.3 postgresql-9.4
2个回答
0
投票

您可以使用这样的DELETE语句来达到您的目的。

DELETE FROM ids   
where id NOT IN ( select UNNEST('{1,2,4,5,6}'::INT[]) ) ;

DEMO


0
投票

您可以使用返回已删除的ID的sql函数:

CREATE OR REPLACE FUNCTION example_array_input(in_clause INT[]) RETURNS SETOF ids
  language sql
AS  
$SQL$
  DELETE
    FROM ids
    WHERE id NOT IN ( SELECT unnest(in_clause) )
  RETURNING id;
$SQL$;

您可以在http://rextester.com/PFG55537中看到一个正在运行的示例

在1到10个表中运行

SELECT * FROM example_array_input('{1,2,4,5,6}'::INT[]);

你获得:result

© www.soinside.com 2019 - 2024. All rights reserved.