Home > Database > Mysql Tutorial > 【原创】PostgreSQL给数组排序

【原创】PostgreSQL给数组排序

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
Release: 2016-06-07 14:52:53
Original
1574 people have browsed it

PostgreSQL 支持数组,但是没有对数据内部元素进行排序的一个函数。 今天我分别用PLPGSQL和PLPYTHONU写了一个。 示例表结构: t_girl=#\dtest_array;Table"ytt.test_array"Column|Type|Modifiers--------+-----------+-------------------------------------

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)
Copy after login

示例数据:

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
Copy after login

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
Copy after login

降序

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=#
Copy after login

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
Copy after login

升序:

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=#
Copy after login


附: 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;
Copy after login



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;
Copy after login


Related labels:
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template