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中的行轉列和列轉行函數,或者不使用函數如何實現呢,敬請期待後續作品……


參考

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