【原创】PostgreSQL 给数组排序

前端之家收集整理的这篇文章主要介绍了【原创】PostgreSQL 给数组排序前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

Postgresql 支持数组,但是没有对数据内部元素进行排序的一个函数。 今天我分别用PLPGsql和PLPYTHONU写了一个。

示例表结构:

  1. t_girl=#\dtest_array;
  2. Table"ytt.test_array"
  3. Column|Type|Modifiers
  4. --------+-----------+---------------------------------------------------------
  5. id|integer|notnulldefaultnextval('test_array_id_seq'::regclass)
  6. str1|integer[]|
  7. Indexes:
  8. "test_array_pkey"PRIMARYKEY,btree(id)

示例数据:

  1. t_girl=#select*fromtest_array;
  2. id|str1
  3. ----+---------------------------
  4. 1|{100,200,300,5,10,20,100}
  5. 2|{200,100,2,30,5}
  6. 3|{2000,101,10}
  7. (3rows)
  8. Time:1.513ms

plsql存储函数array_sort执行结果:

升序

  1. t_girl=#selectid,array_sort(str1,'asc')fromtest_array;
  2. id|array_sort
  3. ----+---------------------------
  4. 1|{5,300}
  5. 2|{0,200}
  6. 3|{0,2000}
  7. (3rows)
  8. Time:2.377ms

降序

  1. t_girl=#selectid,'desc')fromtest_array;
  2. id|array_sort
  3. ----+---------------------------
  4. 1|{300,5}
  5. 2|{200,0}
  6. 3|{2000,0}
  7. (3rows)
  8. Time:3.318ms
  9. t_girl=#

python 存储函数array_sort_python 执行结果:

降序:

  1. t_girl=#selectid,array_sort_python(str1,'desc')fromtest_array;
  2. id|array_sort_python
  3. ----+---------------------------
  4. 1|{300,0}
  5. (3rows)
  6. Time:2.797ms

升序:

  1. t_girl=#selectid,'asc')fromtest_array;
  2. id|array_sort_python
  3. ----+---------------------------
  4. 1|{5,2000}
  5. (3rows)
  6. Time:1.856ms
  7. t_girl=#


附: array_sort_python 代码:

  1. CREATEorreplaceFUNCTIONarray_sort_python(c1text[],f_ordertext)RETURNStext[]AS$$
  2. result=[]
  3. iff_order.lower()=='asc':
  4. c1.sort()
  5. result=c1
  6. eliff_order.lower()=='desc':
  7. c1.sort(reverse=True)
  8. result=c1
  9. else:
  10. pass
  11. returnresult
  12. $$LANGUAGEplpythonu;



array_sort 代码

  1. createorreplacefunctionarray_sort(anyarray,f_ordertext)returnsanyarray
  2. as
  3. $ytt$
  4. declarearray1aliasfor$1;
  5. tmpint;
  6. resulttext[];
  7. begin
  8. iflower(f_order)='desc'then
  9. fortmpinselectunnest(array1)asaorderbyadesc
  10. loop
  11. result:=array_append(result,tmp::text);
  12. endloop;
  13. returnresult;
  14. elsiflower(f_order)='asc'then
  15. fortmpinselectunnest(array1)asaorderbyaasc
  16. loop
  17. result:=array_append(result,tmp::text);
  18. endloop;
  19. returnresult;
  20. else
  21. returnarray['f_ordermustbeascordesc!'];
  22. endif;
  23. end;
  24. $ytt$languageplpgsql;

猜你在找的Postgre SQL相关文章