postgresql版本是8.2.15。

最近陆续有数据分析师从impala、hive转到查询gpdb,gpdb虽然能够支持在查询语句中带多个distinct,但是缺少相应的if、ifnull、group_concat函数,正好年后有空就拓展一些函数给他们用

1. to_array聚集函数

CREATE AGGREGATE pg_catalog.to_array (anyelement)
(
sfunc = array_append,
stype = anyarray,
initcond = '{}'
);

2. if函数

create function if(expr bool, true_result anyelement, false_result anyelement) RETURNS anyelement AS
$$
BEGIN
if expr then return true_result;
else return false_result;
end if;
END;
$$
LANGUAGE plpgsql;

3. ifnull函数

create function ifnull(value anyelement, null_value anyelement) RETURNS anyelement AS
$$
BEGIN
if value is null then return null_value;
else return value;
end if;
END;
$$
LANGUAGE plpgsql;

if第2、3参数和ifnull的两个参数需要指明其中一个参数的类型,而且类型要一样,比如ifnull('a'::text, 'b'),由于两个参数都是输出,因此他们的类型必须一致,指出其中一个参数类型,另一个参数的类型也就确定了。常量参数必须要指明其中一个参数的类型,但表字段本身就有类型,因此不需要特意指出类型,如ifnull(city_name, 'b'),同样也要注意两个参数类型一致,不能写ifnull(city_name, 3)

其中用聚组函数to_array配合distinct语句、array_to_string函数来模拟group_concat函数的功能,例如group_concat(city_name, ',')可以改成array_to_string(to_array(distinct city_name), ',')

为什么不直接写一个group_concat聚组函数呢?因为pg的的聚组函数只能从一种类型转变成另一种,不能连续转变成第二种,因此普通字段需要先转变成数组,然后再变成字符串。

那么为什么不先把字段变成字符串,然后拼接在一起呢?因为postgresql8.2.15版本没有任何一个去重函数,只能用distinct语句来去重,同时distinct只能用在“只有一个参数的聚组函数”中,对于group_concat(distinct city_name, ',')这条语句,group_concat有两个参数,语法有错。这么一来二去,只能用两层函数去实现group_concat了

2017年2月9号发现postgresql原生就有一个array_agg聚合函数,相当于to_array的功能

distinct和group的区别

distinct: 适用于重复度高、值可枚举、种类少的字段,因为ditinct保存在内存中,如果种类太多内存会爆,去重速度快

group: 生成临时表,速度慢,没有内存爆的问题

最新文章

  1. SD卡的监听
  2. C# winform 界面美化技巧(扁平化设计)
  3. 代码中access 的使用
  4. 网页闯关游戏(riddle webgame)--SQL注入的潘多拉魔盒
  5. GridPanel中getSelectionModel
  6. html5中manifest特性测试
  7. Java 进程(转)
  8. jmeter测试某个QPS下的响应时间-设置QPS限制
  9. iOS实例下载:使用腾讯的SDK将新浪微薄嵌入到应用中
  10. Vue深度学习(6)- 组件
  11. fedora27安装DB2 Express-C 11
  12. ProxyChains 的坑, 需要关闭 sip
  13. Ueditor注意的地方
  14. jqgrid 插件的使用
  15. Day 4 变量常量
  16. Linux服务器上监控网络带宽的18个常用命令 zz
  17. 观察者模式--java
  18. C++11中的右值引用及move语义编程
  19. (转)JPA & Restful
  20. 分布式搜索elasticsearch几个概念解析

热门文章

  1. kinEditor动态渲染的问题
  2. 「JavaSE 重新出发」02.01 基本数据类型
  3. Python读取Matlab的.mat文件
  4. Fiddler常用配置
  5. 简洁的MVC思想框架——Nancy(Post操作与外部引用css和JS)
  6. 如何使用 Open Live Writer 插入原图
  7. How Javascript works (Javascript工作原理) (八) WebAssembly 对比 JavaScript 及其使用场景
  8. BZOJ 3881 [COCI2015]Divljak (Trie图+Fail树+树链的并+树状数组维护dfs序)
  9. 洛谷 P1088 火星人 (全排列)
  10. 洛谷 P2734 游戏 A Game