source: subversion/sites/www.openstreetbrowser.org/src/sql/02_natsort.sql @ 29773

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

New plsql function: array_nat_sort(text[]) sorts 'naturally'

File size: 2.1 KB
Line 
1-- returns true if second argument is higher than first argument
2CREATE OR REPLACE FUNCTION nat_cmp (text, text)
3returns bool
4as $$
5declare
6  left  alias for $1;
7  right alias for $2;
8  l1 text;
9  r1 text;
10  l2 text;
11  r2 text;
12  ul1 text;
13  ur1 text;
14begin
15  l1=substring(left  from '^([0-9]+).*$');
16  r1=substring(right from '^([0-9]+).*$');
17  l2=substring(left  from '^[0-9]+(.*)$');
18  r2=substring(right from '^[0-9]+(.*)$');
19
20  if l1 is null then
21    l1:='';
22  end if;
23
24  if r1 is null then
25    r1:='';
26  end if;
27
28  if l1!='' and r1!='' then
29    if cast(l1 as int)<cast(r1 as int) then
30      return true;
31    end if;
32    if l1=r1 then
33      return nat_cmp(l2, r2);
34    end if;
35    if cast(l1 as int)>cast(r1 as int) then
36      return false;
37    end if;
38  end if;
39
40  if l1='' and r1!='' then
41    return false;
42  end if;
43
44  if l1!='' and r1='' then
45    return true;
46  end if;
47
48  l1=substring(left  from '^([^0-9]*)([0-9].*)?$');
49  r1=substring(right from '^([^0-9]*)([0-9].*)?$');
50  l2=substring(left  from '^[^0-9]+([0-9].*)$');
51  r2=substring(right from '^[^0-9]+([0-9].*)$');
52  ul1=upper(l1);
53  ur1=upper(r1);
54
55  if l1 is null then l1:=''; end if;
56  if r1 is null then r1:=''; end if;
57  if l2 is null then l2:=''; end if;
58  if r2 is null then r2:=''; end if;
59
60  if l1!='' and r1!='' then
61    if ul1<ur1 then
62      return true;
63    end if;
64    if ul1=ur1 then
65      if (l1=r1) or (l2!='' and r2!='') then
66        return nat_cmp(l2, r2);
67      else
68        return l1<l2;
69      end if;
70    end if;
71    if ul1>ur1 then
72      return false;
73    end if;
74  end if;
75
76  if l1='' and r1!='' then
77    return true;
78  end if;
79
80  if l1!='' and r1='' then
81    return false;
82  end if;
83
84  return false;
85end
86$$ language 'plpgsql';
87
88CREATE OR REPLACE FUNCTION array_nat_sort (text[])
89RETURNS text[]
90AS $$
91declare
92src     alias for $1;
93list    text[];
94i int:=1;
95j int:=1;
96h text;
97begin
98  list=src;
99  while i<=array_count(list) loop
100    j:=1;
101    while j<i loop
102      if nat_cmp(list[i], list[j]) then
103        h:=list[i];
104        list[i]=list[j];
105        list[j]=h;
106      end if;
107      j:=j+1;
108    end loop;
109    i:=i+1;
110  end loop;
111
112  return list;
113end
114$$ language 'plpgsql';
115
116
Note: See TracBrowser for help on using the repository browser.