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;

最新文章

  1. 06.移动先行之谁主沉浮----我的代码我来写(Xaml的优势)
  2. [转]使用 google gson 转换Timestamp或Date类型为JSON字符串.
  3. python解析RSS(feedparser)
  4. IE浏览器打开f12才正常
  5. 《理解 ES6》阅读整理:块绑定(Block Binding)
  6. sql 截取字符串第一次出现字符之前的数据
  7. QQ互联登录回调路径错误redirect uri is illegal(100010)
  8. Newtonsoft.Json.dll使用
  9. Java之Property-统获取一个应用程序运行的次数
  10. Bash For Loop Examples for Your Linux Shell Scripting--ref
  11. AOP 在javascript 中的使用
  12. hdu1198 Farm Irrigation 并查集
  13. python--socket粘包
  14. djangorestframework+vue-cli+axios,为axios添加token作为headers踩坑记
  15. Java开发笔记(四十二)日历工具的常见应用
  16. java 常用的类
  17. 对象何时进入老年代、何时发生full gc
  18. CSS——对height和line-height的理解
  19. 洗礼灵魂,修炼python(61)--爬虫篇—【转载】requests模块
  20. Java Servlet生成JSON格式数据并用jQuery显示

热门文章

  1. Ionic 左侧菜单(登录主页详情demo)
  2. 组件:组合slot
  3. Docx 生成word文档二
  4. 记一次PHP 数组基本用法
  5. Windows Sublime text3 搭建Go语言环境
  6. [转] Blob对象
  7. linux把普通用户添加到sudo组
  8. beego应用做纯API后端如何使用jwt实现无状态权限验证
  9. POJ 3628 Bookshelf 2【背包型DFS/选or不选】
  10. 2019.8.13 NOIP模拟测试19 反思总结