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: 生成临时表,速度慢,没有内存爆的问题

postgresql拓展if、ifnull、group_concat函数的更多相关文章

  1. 【mysql】group_concat函数substring_index函数

    1.group_concat函数:用于将多个字符串连接成一个字符串 用法规则: SELECT GROUP_CONCAT(拼接的字段) from tableName; 使用:查询basic_projec ...

  2. group_concat函数详解

    来自: http://hchmsguo.iteye.com/blog/555543 MySQL中group_concat函数 完整的语法如下: group_concat([DISTINCT] 要连接的 ...

  3. group_concat函数与find_in_set()函数相结合

    一:group_concat函数详解 1.语法如下: group_concat([DISTINCT] 要连接的字段 [Order BY ASC/DESC 排序字段] [Separator '分隔符'] ...

  4. 教您如何使用MySQL group_concat函数

    MySQL group_concat函数是典型的字符串连接函数,下面就为您介绍MySQL group_concat的语法,希望对您学习MySQL group_concat函数有所帮助. MySQL g ...

  5. mysql中group_concat函数用法

    该函数返回带有来自一个组的连接的非NULL值的字符串结果.该函数是一个增强的Sybase SQL Anywhere支持的基本LIST()函数. 语法结构: GROUP_CONCAT([DISTINCT ...

  6. Mysql group_concat函数被截断的问题

    mysql group_concat函数被截断的问题   MySQL的 group_concat 函数默认返回1024个字节长度,超过长度的会被截断.最近程序中就遇到这个问题了. 通过如下命令可以查看 ...

  7. mysql中的group_concat函数的用法

    本文通过实例介绍了MySQL中的group_concat函数的使用方法,比如select group_concat(name) . MySQL中group_concat函数 完整的语法如下: grou ...

  8. Mysql 列转行group_concat函数,与行转列

    1.正常情况. SELECT JoinEventIds from nt_mainnum 2.使用group_concat函数 select group_concat(JoinEventIds) fro ...

  9. mysql group_concat函数是有长度限制的

    在表关联查询中,特别是一对多关系的表查询中,group_concat函数是很有用的一个函数,帮助我们减少对数据库查询的次数,减少服务器的压力. 但是今天使用group_concat函数查询数据库时,发 ...

随机推荐

  1. proxy in java

    [Static] IFeature.java ImpicateF.java Runport.java StaticProxy.java IFeature.java package UProxy.sta ...

  2. 四个例子实战讲解.htaccess文件rewrite规则(转)

    一.防盗链功能 1 2 3 4 RewriteEngine On RewriteCond %{HTTP_REFERER} !^http://(.+.)?mysite.com/ [NC] Rewrite ...

  3. ActiveMQ学习笔记(5)----Broker的启动方式

    Broker:相当于一个ActiveMQ服务器实例,在实际的开发中我们可以启动多个Broker. 命令行启动参数示例如下: 1. activemq start 使用默认的activemq.xml来启动 ...

  4. POJ 1742 Coins(多重背包?)

    题解 一个自然的思路是对于每一个物品做一次01背包 然后T飞了. 试着用二进制拆分,还是T了. 单调队列,对不起,懒,不想写. 我们这样想.设dp[i]代表i这个面值前几种硬币是否能凑到 然后对于每一 ...

  5. BZOJ 1444 [JSOI2009]有趣的游戏 (Trie图/AC自动机+矩阵求逆)

    题目大意:给你$N$个长度相等且互不相同的模式串,现在有一个字符串生成器会不断生成字符,其中每个字符出现的概率是$p_{i}/q_{i}$,当生成器生成的字符串包含了某个模式串,则拥有该模式串的玩家胜 ...

  6. UT源码+105032014018

    设计佣金问题的程序 commission方法是用来计算销售佣金的需求,手机配件的销售商,手机配件有耳机(headphone).手机壳(Mobile phone shell).手机贴膜(Cellphon ...

  7. window下搭建Python3.7+selenium3.1.1+pycharm环境

    1.安装Python3.7 1.1  下载 Python并安装 Python3.5 (勾选上 Add Python3.7 to PATH) 点击 Install Now,安装完成后将python路径加 ...

  8. STM32为什么必须先配置时钟

    首先,任何外设都需要时钟,51单片机,stm32,430等等,因为寄存器是由D触发器组成的,往触发器里面写东西,前提条件是有时钟输入. 51单片机不需要配置时钟,是因为一个时钟开了之后所有的功能都可以 ...

  9. Spring的控制反转(IOC)和依赖注入(DI)具体解释

    Spring的控制反转(IOC)和依赖注入(DI)具体解释 首先介绍下(IOC)控制反转: 所谓控制反转就是应用本身不负责依赖对象的创建及维护,依赖对象的创建及维护是由外部容器负责的.这样控制器就有应 ...

  10. linux清除邮件队列

    [root@localhost mail]#tmp=`mailq | grep -E "root" | awk '{print $1}'` [root@localhost mail ...