一、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中都有相應的函數……
哎不賣關子了,直接上我們的條件表達式對應的函數 greatest
和least
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;
GREATEST
和LEAST
函數從一個任意的數字表達式列表裏選取最大或者最小的數值。 這些表達式必須都可以轉換成一個普通的數據類型,它將會是結果類型 (http://www.postgres.cn/docs/9.6/typeconv-union-case.html)。列表中的 NULL 數值將被忽略。只有所有表達式的結果都是 NULL 的時候,結果纔會是 NULL。
請注意GREATEST
和LEAST
都不是 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中的行轉列和列轉行函數,或者不使用函數如何實現呢,敬請期待後續作品……