我在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]
我该怎么做?
答案 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;