给定两个数组如何获取不在两者中的项目?

时间:2015-12-15 13:49:41

标签: sql arrays postgresql relational-algebra

我在postgresql中有两个数组:

onData()

我想添加一个CREATE OR REPLACE FUNCTION func() RETURNS void AS $BODY$ declare first integer[]; second integer[]; array_vb integer[]; array_vb2 integer[]; begin code.... select array_agg(id) into first from a where id = any (array_vb); select array_agg(id) into second from a where id = any (array_vb2); end; $BODY$ LANGUAGE plpgsql VOLATILE ,它会打印出第一个但不是第二个的所有项目

例如:

raise notice

它会打印first = [1,10,15,3,7] second = [1,3,15,4]

我该怎么做?

4 个答案:

答案 0 :(得分:2)

您可以使用PostgreSQL unsent功能:

SELECT ARRAY(SELECT unnest(first) EXCEPT SELECT unnest(second))

示例:

SELECT ARRAY(SELECT unnest(ARRAY[1,10,15,3,7]) EXCEPT SELECT unnest(array[1,3,15,4]))

给出:

array
--------
{10,7}

参见SQLFiddle here

答案 1 :(得分:1)

您可以使用intarray extension

create extension if not exists intarray;

select array[1,10,15,3,7] - array[1,3,15,4] as result;

 result 
--------
 {7,10}
(1 row)

答案 2 :(得分:0)

create or replace function f(a1 int[], a2 int[])
returns void as $body$ 
begin

    raise notice '%', (
        select string_agg(i::text, ',')
        from
            unnest (a1) a1(i)
            left join
            unnest (a2) a2(i) using (i)
        where a2.i is null
    );

end;
$body$ language plpgsql volatile
;
select f(array [1,10,15,3,7], array [1,3,15,4]);
NOTICE:  10,7
 f 
---

(1 row)

请注意,上述功能可以标记为immutable

答案 3 :(得分:0)

您可以创建一个返回所需数组结果的函数:

create or replace function array_except(a1 int[], a2 int[])
  returns int[]
as
$$
    select array_agg(i)
    from ( 
      select i
      from unnest(a1) i
      except 
      select a2
      from unnest(a2) a2
    ) t;
$$ 
language sql;

该函数返回一个数组,该数组包含第一个但不在第二个数组中的元素。

您可以在实际功能中使用上述功能:

create or replace function foo()
  returns void
as
$BODY$
declare 
  _first integer[];
  _second integer[];
begin

    _first := array[1,10,15,3,7];
    _second := array[1,3,15,4];
    raise notice 'Result %', array_except(_first, _second);

end;
$BODY$
LANGUAGE plpgsql;