为了账号安全,请及时绑定邮箱和手机立即绑定

【原创】PostgreSQL 给数组排序

标签:
Python


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 ms

t_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 ms

t_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 = c1

elif f_order.lower() == 'desc':

    c1.sort(reverse=True)

    result = c1

else:

    pass

return 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;

©著作权归作者所有:来自51CTO博客作者david_yeung的原创作品,如需转载,请注明出处,否则将追究法律责任


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消