PostgreSQL 給數組排序

來源:互聯網
上載者:User

PostgreSQL 支援數組,但是沒有對資料內部元素進行排序的一個函數。  今天我分別用PLPGSQL和PLPYTHONU寫了一個。
樣本表結構:

t_girl=# \d test_array;                            Table "ytt.test_array" Column |   Type    |                        Modifiers                        --------+-----------+--------------------------------------------------------- id     | integer   | not null default nextval('test_array_id_seq'::regclass) str1   | integer[] | Indexes:    "test_array_pkey" PRIMARY KEY, btree (id)



樣本資料:
t_girl=# select * from test_array;                                         id |           str1            ----+---------------------------  1 | {100,200,300,5,10,20,100}  2 | {200,100,2,30,0,5}  3 | {2000,101,2,30,0,10}(3 rows)Time: 1.513 ms




plsql儲存函數array_sort執行結果:
升序
t_girl=# select id,array_sort(str1,'asc') from test_array;        id |        array_sort         ----+---------------------------  1 | {5,10,20,100,100,200,300}  2 | {0,2,5,30,100,200}  3 | {0,2,10,30,101,2000}(3 rows)Time: 2.377 ms


降序
t_girl=# select id,array_sort(str1,'desc') from test_array;    id |        array_sort         ----+---------------------------  1 | {300,200,100,100,20,10,5}  2 | {200,100,30,5,2,0}  3 | {2000,101,30,10,2,0}(3 rows)Time: 3.318 mst_girl=# 




python 儲存函數array_sort_python 執行結果:
降序:
t_girl=# select id,array_sort_python(str1,'desc') from test_array; id |     array_sort_python     ----+---------------------------  1 | {300,200,100,100,20,10,5}  2 | {200,100,30,5,2,0}  3 | {2000,101,30,10,2,0}(3 rows)



Time: 2.797 ms


升序:
t_girl=# select id,array_sort_python(str1,'asc') from test_array;     id |     array_sort_python     ----+---------------------------  1 | {5,10,20,100,100,200,300}  2 | {0,2,5,30,100,200}  3 | {0,2,10,30,101,2000}(3 rows)Time: 1.856 mst_girl=# 




附: array_sort_python 代碼:
CREATE or replace FUNCTION array_sort_python(c1 text [],f_order text) RETURNS text [] AS $$result = []if f_order.lower() == 'asc':    c1.sort()    result = c1elif f_order.lower() == 'desc':    c1.sort(reverse=True)    result = c1else:    passreturn result$$ LANGUAGE plpythonu;





array_sort 代碼:


create or replace function array_sort(anyarray,f_order text) returns anyarray as  $ytt$declare array1 alias for $1;              tmp int;      result text [];begin  if lower(f_order) = 'desc' then    for tmp in select unnest(array1) as a order by a desc    loop      result := array_append(result,tmp::text);    end loop;    return result;  elsif lower(f_order) = 'asc' then    for tmp in select unnest(array1) as a order by a asc    loop      result := array_append(result,tmp::text);    end loop;    return result;   else      return array['f_order must be asc or desc!'];   end if;end;$ytt$ language plpgsql;




相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.