1

Temat: Funkcja contains dla tablic

Potrzbuje wrzucic do zapytania operator zawierania jednej tablicy w drugiej. W nowych wersjach (od 8.2) Pgsql jest to operator "@>" ale ja musze to zrobić na wersji 8.1 (taki hosting sad ). Wiem może ktoś jak to zrobić ??

2

Odp: Funkcja contains dla tablic

Będziesz potrzebował własnej funkcji i może operatora. To moge zaproponowac na szybkiego (ale rozwiązanie nie jest perfekcyjne, nie podales co moga zawierac tablice, tu załozyłem ze nie moga zawierac znaku '*')

drop function contains(anyarray,anyarray) cascade;
create or replace function contains (a anyarray, b anyarray) returns boolean  as $$
declare
string varchar;
tab1 varchar;
tab2 varchar;
begin
select into tab1 array_to_string(m,' ') from (select array(select(a)[i]
        from generate_series(1,array_upper(a,1)) i order by 1) as m) foo2;

select into tab2 array_to_string(m,'*') from (select array(select(b)[i]
        from generate_series(1,array_upper(b,1)) i order by 1) as m) foo2;

select into string regexp_replace(tab1,tab2,'$');

if string like '%$%'
        then return true;
end if;
return false;
end;
$$
language plpgsql;

create operator === (
        leftarg = anyarray,
        rightarg = anyarray,
        commutator = ===,
        procedure = contains);

i sposob uzycia

postgres=# select 1 as result where array[1,2,3,4] === array[1,3,2];
 result 
--------
      1
(1 row)

postgres=# select 1 as result where array[1,2,3,4] === array[1,3,5];
 result 
--------
(0 rows)

Mam nadzieje ze sie nigdzie nie walnąłem smile.