今天上班的时候,有一个哥们跑过来问我,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中都有相应的函数……
哎不卖关子了,直接上我们的条件表达式对应的函数 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;
GREATEST
和LEAST
函数从一个任意的数字表达式列表里选取最大或者最小的数值。 这些表达式必须都可以转换成一个普通的数据类型,它将会是结果类型 (http://www.postgres.cn/docs/9.6/typeconv-union-case.html)。列表中的 NULL 数值将被忽略。只有所有表达式的结果都是 NULL 的时候,结果才会是 NULL。
请注意GREATEST
和LEAST
都不是 SQL 标准,但却是很常见的扩展。某些其他数据库让它们在任何参数为 NULL 时返回 NULL,而不是在所有参数都为 NULL 时才返回 NULL。
NULLIF(value1, value2)
当value1和value2相等时,NULLIF返回一个空值。 否则它返回value1。
COALESCE(value [, ...])
COALESCE函数返回它的第一个非空参数的值。当且仅当所有参数都为空时才会返回空。它常用于在为显示目的检索数据时用缺省值替换空值
SQL CASE
表达式是一种通用的条件表达式,类似于其它编程语言中的 if/else 语句。
回到最开始的提及的点,PostgreSQL中的行转列和列转行函数,或者不使用函数如何实现呢,敬请期待后续作品……
http://www.postgres.cn/docs/9.6/functions-conditional.html
PostgreSQL中的crosstab(行转列函数)https://blog.csdn.net/qq_31156277/article/details/90598311