postgresql中条件表达式 case 、coalesce、nullif 、greatest、least

一、postgresql中条件表达式

今天上班的时候,有一个哥们跑过来问我,pg有没有行转列的函数,如何实现行转列,他说他pg中没有找到,问我知道不,我想了一下,好像有,不过不像SQLserver 那么好用,但行转列很简单啊,使用多个union all 就简单搞定了啊,于是他给我看了他的问题

select id,a,b,c,d,e,f,g
from biztable;

想比较 a,b,c,d,e,f,g 中的大小。他想行转列后采用极值函数进行比较

select temp.id,max(val) from
(
	select id,a as val from biztable 
	union all
	select id,b as val  from biztable 
	
	……
	union all
	select id,g as val  from biztable
)  AS temp
group by temp.id;

这个就是他想做的,但因为字段比较多,这样的性能不推荐。

我说可以用 case when ,但是case when 分支太多了,不推崇。另外在SQLserver、Oracle中都有相应的函数……

哎不卖关子了,直接上我们的条件表达式对应的函数 greatestleast


1.1 GREATEST和LEAST

GREATEST(value [, ...])

LEAST(value [, ...])
# 注意比较值得类型一定要相同

案例:比较time1,time2, time3 三个时间大小

-- drop table biztable
create table biztable (
	id int PRIMARY key,
	time1 TIMESTAMP,
	time2 TIMESTAMP,
    time3 TIMESTAMP
);
-- truncate table biztable

select * from biztable;
insert into	biztable VALUES(1,'2018-05-20 22:52','2019-05-20 22:54','2019-05-20 23:52');

select id,GREATEST(time1,time2,time3)as maxval, LEAST(time1,time2,time3) AS minval
from biztable;

在这里插入图片描述

GREATESTLEAST函数从一个任意的数字表达式列表里选取最大或者最小的数值。 这些表达式必须都可以转换成一个普通的数据类型,它将会是结果类型 (http://www.postgres.cn/docs/9.6/typeconv-union-case.html)。列表中的 NULL 数值将被忽略。只有所有表达式的结果都是 NULL 的时候,结果才会是 NULL。

请注意GREATESTLEAST都不是 SQL 标准,但却是很常见的扩展。某些其他数据库让它们在任何参数为 NULL 时返回 NULL,而不是在所有参数都为 NULL 时才返回 NULL。


1.2 nullif

NULLIF(value1, value2)

当value1和value2相等时,NULLIF返回一个空值。 否则它返回value1。


1.3 COALESCE

COALESCE(value [, ...])

COALESCE函数返回它的第一个非空参数的值。当且仅当所有参数都为空时才会返回空它常用于在为显示目的检索数据时用缺省值替换空值


1.4 case

SQL CASE表达式是一种通用的条件表达式,类似于其它编程语言中的 if/else 语句。


回到最开始的提及的点,PostgreSQL中的行转列和列转行函数,或者不使用函数如何实现呢,敬请期待后续作品……


参考

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章