source: subversion/sites/www.openstreetbrowser.org/src/sql/01_functions.sql @ 29773

Last change on this file since 29773 was 19912, checked in by skunk, 11 years ago

function array_unique: ignore null-values

File size: 3.1 KB
Line 
1drop aggregate if exists to_textarray(text);
2CREATE AGGREGATE to_textarray (
3BASETYPE = text,
4SFUNC = array_append,
5STYPE = text[],
6INITCOND = '{}'); 
7
8drop aggregate if exists to_intarray(int4);
9CREATE AGGREGATE to_intarray (
10BASETYPE = int4,
11SFUNC = array_append,
12STYPE = int4[],
13INITCOND = '{}'); 
14
15drop aggregate if exists to_intarray(int[]);
16CREATE AGGREGATE to_intarray (
17BASETYPE = int4[],
18SFUNC = array_cat,
19STYPE = int4[],
20INITCOND = '{}'); 
21
22create or replace function array_toint(anyarray)
23returns int[]
24as $$
25declare
26  arr alias for $1;
27  dest int[];
28  i int:=1;
29begin
30  if arr is null then
31    return null;
32  end if;
33  for i in array_lower(arr, 1)..array_upper(arr, 1) loop
34    if arr[i] similar to '^[0-9]+$' then
35      dest[i]=cast (arr[i] as int);
36    end if;
37  end loop;
38  return dest;
39end;
40$$ language 'plpgsql';
41
42CREATE OR REPLACE FUNCTION array_sort (ANYARRAY)
43RETURNS ANYARRAY LANGUAGE SQL
44AS $$
45SELECT ARRAY(
46  SELECT $1[s.i] AS "foo"
47  FROM generate_series(array_lower($1,1), array_upper($1,1)) AS s(i)
48  ORDER BY foo
49);
50$$;
51
52CREATE OR REPLACE FUNCTION array_unique(int[])
53RETURNS int[]
54AS $$
55declare
56-- src   int[]=array_sort($1);
57arr alias for $1;
58src   int[];
59index int:=1;
60ret   int[];
61last  int:=0;
62begin
63src=array_sort(arr);
64while src[index]>0
65  loop
66    if src[index]<>last then
67      ret=array_append(ret, src[index]);
68      last:=src[index];
69    end if;
70    index:=index+1;
71  end loop;
72
73return ret;
74end;
75$$ language 'plpgsql';
76
77CREATE OR REPLACE FUNCTION array_pos(text[], text)
78RETURNS int
79AS $$
80declare
81-- src   int[]=array_sort($1);
82haystack   alias for $1;
83needle     alias for $2;
84i int:=1;
85begin
86  while i<=array_count(haystack) loop
87    if haystack[i]=needle then
88      return i;
89    end if;
90    i:=i+1;
91  end loop;
92
93  return null;
94end
95$$ language 'plpgsql';
96
97CREATE OR REPLACE FUNCTION array_unique(text[])
98RETURNS text[]
99AS $$
100declare
101-- src   int[]=array_sort($1);
102src   alias for $1;
103src_i int:=1;
104ret   text[];
105ret_i int:=1;
106found bool;
107begin
108  while src_i<=array_count(src) loop
109    ret_i:=1;
110    found:=false;
111
112    if src[src_i] is null then
113      found:=true;
114    end if;
115
116    while (ret_i<=array_count(ret)) and not found loop
117      if src[src_i]=ret[ret_i] then
118        found:=true;
119      end if;
120      ret_i:=ret_i+1;
121    end loop;
122
123    if found=false then
124      ret=array_append(ret, src[src_i]);
125    end if;
126
127    src_i:=src_i+1;
128  end loop;
129  return ret;
130end
131$$ language 'plpgsql';
132
133create function array_explode1(anyarray) returns setof anyelement as
134'begin
135for i in array_lower($1, 1) array_upper($1, 1) loop
136return next $1[i];
137end loop;
138return;
139end' language plpgsql strict immutable;
140create function array_explode(anyarray) returns setof anyelement as
141'select * from array_explode1($1)' language sql strict immutable;
142
143create function array_text_explode(text[]) returns text as
144'begin
145for i in array_lower($1, 1) array_upper($1, 1) loop
146return next $1[i];
147end loop;
148return;
149end' language plpgsql strict immutable;
150
151CREATE OR REPLACE FUNCTION array_count(anyarray)
152RETURNS int
153AS $$
154declare
155arr alias for $1;
156i int;
157begin
158  if(arr is null) then
159    return 0;
160  end if;
161  return cast (substring(array_dims(arr), ':(.+)]$') as int);
162end;
163$$ language 'plpgsql';
164
165
Note: See TracBrowser for help on using the repository browser.