PostgreSQL 常用函数

数字函数

  • abs
    求绝对值
select abs(-20.5); -- 20.5
  • ceil
    取上限
select ceil(14.2); -- 15
  • floor
    取下限
select floor(14.8); -- 14
  • least
    取最小值
select least(11, 4, 5);
  • mod
    取余数
select mod(9, 4); -- 1
  • round
    四舍五入
select round(11.2); -- 11
select round(11.8); -- 12

聚集函数

数据准备:

create table table9(
  id int4,
  num int4
);
insert into table9 (id, num) values (1, 12);
insert into table9 (id, num) values (1, 15);
insert into table9 (id, num) values (2, 11);
insert into table9 (id, num) values (3, 17);
insert into table9 (id, num) values (3, 14);
  • count
    统计行数
select count(*) from table9; -- 5
  • avg
    取均值
select id, avg(num) from table9 group by id;
  • max
    取最大值
select id, max(num) from table9 group by id;
  • min
    取最小值
select id, min(num) from table9 group by id;
  • sum
    求和
select id, sum(num) from table9 group by id;

字符函数

数据准备:

create table table8(
  id int4,
  name text,
  line text
);
insert into table8 (id, name, line) values (1001, 'aladdin', 'xAddcwWf345ww');
  • char_length
    字符数
select char_length(line) from table8; -- 13
  • concat
    拼接字符串
select concat(id, name, '&&') from table8; -- 1001aladdin&&
  • concat_ws
    拼接字符串,并指定分隔符
select concat_ws('_', id, name, line) from table8; -- 1001_aladdin_xAddcwWf345ww
  • substring
    截取字符串
-- 从 3 开始,截取 2 个
select substring(line, 3, 2) from table8;
  • split_part
    分割字符串
select split_part('aladdin.im', '.', 1); -- aladdin
  • upper
    将字符串转大写
select upper(line) from table8;
  • lower
    转小写
select lower(line) from table8; -- xaddcwwf345ww
  • ltrim
    去除字符串左边空格
select ltrim('  xxdd  ');
  • rtrim
    去除字符串右边空格
select rtrim('  xx  ');
  • position
    字符串首次出现的位置
select position('Add' in line) from table8;
  • repeat
    重复字符串
select repeat(name, 3) from table8; -- aladdinaladdinaladdin
  • replace
    替换字符串
-- 将所有w替换成*
select replace(line, 'w', '*') from table8; -- xAddc*Wf345**
  • left
    返回最左面 n 个字符
select left(line, 5) from table8;
  • right
    返回最右面 n 个字符
select right(line, 3) from table8; -- 5ww
  • rpad
    字符不满,用 * 补全
-- 字符不满 10 个,用 # 补满
select rpad(name, 10, '#') from table8;

日期函数

  • extract
select extract(year from now()); -- 2019
-- week 一年中第几周
-- doy 一年中第几天
  • 四则运算
select now() + interval '1 year'; -- 2020-04-10 09:43:35...
  • age
    时间间隔
select age('2018-5-23'::date, '2015-5-23'::date); -- 3 years 0 mons 0 days 0 hours 0 mins 0.00 secs

聚合函数

  • string_agg
    将结果集的某个字段所有行连接成字符串
-- 第一个参数为合并字段,第二个参数为分隔符
-- 可以用于分组合并
select id, string_agg(name, ',') from table5 group by id; 
  • array_agg
    与 string_agg 类似,但是它返回的是一个数组
select id, array_agg(name) from table5 group by id;
  • array_to_string
    这个函数可以将数组类型数据转换成字符串
select id, array_to_string(array_agg(name), ',') from table5 group by id;
  • array_to_json
    与 array_to_string 类似,这个函数只是将数组转换成了 Json
select array_to_json(arr_int) from table6;

转化函数

  • translate
    将字符串中的内容进行转化
create table public.table3(
msg text
);
insert into public.table3(msg) values ('ALADDIN 2019');
-- translate 函数
select 
     translate(msg, '0123456789ABCD', '##########%%%%') 
from table3; -- %L%%%IN ####
  • replace
    将字符串中的字段进行转化
select 
     replace(msg, 'ALADDIN', 'HELLO') 
from table3; -- HELLO 2019
  • coalesce
    将 null 值转化为特定值
-- 将 null -> 0
select coalesce(t2.sal, 0) from table2 t2;

窗口函数

窗口函数不会将结果集进行分组计算输出一行,而是将计算后的结果集输出到结果集上,可以简化 SQL 代码。
一般情况下,窗口函数能做的事情,都是可以通过复杂的 SQL 语句来实现。

  • avg()
    用于计算分组后的平均值 ( avg() 为聚合函数 + over() 用来进行分组操作 = 分组求均值 )
create table student_score(
stu_id int4,
subject text,
score double precision
);
insert into student_info(id, name) values (1001, 'aladdin'), (1002, 'bilib'), (1003, 'chrome');
insert into
student_score(stu_id, subject, score)
values
       (1001, 'chinese', 90.0), (1001, 'math', 100.0), (1001, 'english', 80.0),
       (1002, 'chinese', 100.0), (1002, 'math', 80.0), (1002, 'english', 60.0),
       (1003, 'chinese', 60), (1003, 'math', 90), (1003, 'english', 100.0);
-- 统计学个各科成绩和各科的平均成绩
select
     ss.subject, si.name, ss.score, avg(ss.score) over(partition by ss.subject)
from
   student_info si left join student_score ss on si.id = ss.stu_id;
  • row_number()
    为分组后数据标注行号
select 
     si.*, ss.subject, ss.score, row_number() over (partition by ss.subject order by ss.score) 
from 
   student_info si left join student_score ss on si.id = ss.stu_id;
  • rank() 和 dense_rank()
    rank() 函数与 row_number() 类似,只是 rank() 会考虑并列的问题,rank() 和 dense_rank() 的区别是,rank() 会产生排序间隙,dense_rank() 不会产生排序间隙:
rank() 的排序结果可能是:1, 1, 3, 4, 4, 6
dense_rank() 的排序结果是:1, 1, 2, 3, 3, 4
  • lag()
    将某字段的数据进行偏移拼接:
select
     si.*, ss.subject, ss.score, lag(ss.score, 1, '100.0') over(partition by ss.subject order by score)
     -- lag(field, offset, default value),如果向上偏 offset = -X
from
   student_info si left join student_score ss on si.id = ss.stu_id;
  • first_value() & last_value()
    取结果集分组后的第一条 / 最后一条数据
select
     ss.subject ,first_value(ss.score) over (partition by subject order by score)
from
   student_score ss;
  • nth_value()
    用来取结果集某一指定行的数据
select
     ss.subject ,nth_value(ss.score, 2) over (partition by subject order by score)
from
   student_score ss;
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343