PostgreSQL 字符串函数汇总

文章目录

  • 前言
    • 拼接字符串
    • 填充字符串
    • 大小写转换
    • 获取字符串长度
    • 截取字符串
    • 裁剪字符串
    • 获取第一个字符的ASCII码
    • 计算string的MD5散列
    • 判断是否包含字符串
    • null 和 '' 的区别与判断以及COALESCE函数
    • nullif函数
    • 合并字符串
    • 将字符串合并成一个数组
    • 分割字符串
  • 总结


前言

本文基于 PostgreSQL 12.6 版本,不同版本的函数可能存在差异。


拼接字符串

|| 是字符串连接操作符,在拼接字符串时要求前两个操作数至少有一个是字符串类型,不然会报错。如下:

select 'a' || 1; -- a1
select 2 || 'a' || 1; -- 2a1
select 2 || 44 || 'a' || 1; -- 报错

填充字符串

lpad(string text, length int [, fill text]) 是在字符串左边填充字符,如果不指定要填充的字符,则默认填充空格,如下:

select LPAD((99 - 1)::text, 6); -- 98
select LPAD((99 - 1)::text, 6, '0'); -- 000098
select LPAD((99 + 1)::text, 6, 'ab'); -- aba100

rpad 函数与 lpad 函数相反,是在字符串右边填充字符。

大小写转换

upperlower 函数,如下:

select upper('test'); --TEST
select lower('TEST'); --test

获取字符串长度

lengthchar_lengthcharacter_length 函数,如下:

select length('test'); -- 4
select char_length('test'); -- 4
select character_length('test'); -- 4

截取字符串

substring 函数,支持下标范围截取或者正则表达式截取,如下:

select substring('PostgreSQL' from 2 for 4); --ostg
select substring('PostgreSQL' from '[a-z]+'); --ostgre

也可以用 substr 函数,如下:

select substr('PostgreSQL', 2, 0); -- 空字符串
select substr('PostgreSQL', 2, 1); -- o
select substr('PostgreSQL', 2, 4); -- ostg
select substr('PostgreSQL', 2); -- ostgreSQL

裁剪字符串

trim 函数,从字符串的开头/结尾/两边(leading/trailing/both)尽可能多地裁剪指定的字符,不指定则裁剪空白符,如下:

select trim(leading 'x' from 'xTestxx'); -- Testxx
select trim(trailing 'x' from 'xTestxx'); -- xTest
select trim(both 'x' from 'xTestxx'); -- Test
select trim(both from ' Test '); -- Test
select trim(' Test '); -- Test

也可以用 ltrimrtrim 或者 btrim 函数,效果同上:

select ltrim('xTestxxy', 'xy'); -- Testxxy
select rtrim('xTestxxy', 'xy'); -- xTest
select btrim('xTestxxy', 'xy'); -- Test

获取第一个字符的ASCII码

ascii 函数,如下:

select ascii('test'); --116
select ascii('t'); --116

如果想从ASCII码转成字符,则使用 chr 函数,参数是int,如下:

select chr(65); -- A

计算string的MD5散列

md5 函数,以十六进制返回结果,如下:

select md5('abc'); -- 900150983cd24fb0d6963f7d28e17f72

判断是否包含字符串

position 函数会返回字符串首次出现的位置,如果没有出现则返回0。因此可以通过返回值是否大于0来判断是否包含指定的字符串。

select position('aa' in 'abcd'); -- 0
select position('bc' in 'abcd'); -- 2
select position('bc' in 'abcdabc');	-- 2

strpos 函数也是同样的效果:

select strpos('abcd','aa'); -- 0
select strpos('abcd','bc'); -- 2
select strpos('abcdabc','bc'); -- 2

此外还可以用正则表达式来判断,返回值是 true 或 false:

select 'abcd' ~ 'aa'; -- false
select 'abcd' ~ 'bc'; -- true
select 'abcdabc' ~ 'bc'; -- true

null 和 ‘’ 的区别与判断以及COALESCE函数

null是一种类型,‘’ 是空字符串,打个比方,‘’ 是你参加了考试且得了零分,而null则是你压根就没有参加考试。

如果要在sql中对两者进行判断,是有区别的:

-- null只能和is或is not搭配,使用=、!=或者<>结果都是null
select null is null; -- true
select null is not null; -- false-- ''的判断可以使用is、is not、=、!=或者<>
select '' is null; -- false
select '' is not null; -- true
select '' = ''; -- true
select '' != ''; -- false
select '' <> ''; -- false-- 任何与null的运算比较,结果都是null
select 1 > null;  -- null

COALESCE函数是返回参数中的第一个非null的值,在 PostgreSQL 10 里,它要求参数中至少有一个是非null的,如果参数都是null会报错。

不过在 PostgreSQL 12.6 版本COALESCE函数允许参数里只有null,此时返回值是null。

select COALESCE(null,null); -- null
select COALESCE(null,null,now()::varchar,''); -- 结果会得到当前的时间
select COALESCE(null,null,'',now()::varchar); -- 空字符串-- 可以和其他函数配合来实现一些复杂点的功能:查询学生姓名,如果学生名字为null或''则显示“姓名为空”
select case when coalesce(null,'') = '' then '姓名为空' else '法外狂徒' end; -- 姓名为空
select case when coalesce('','') = '' then '姓名为空' else '法外狂徒' end; -- 姓名为空
select case when coalesce('张三','') = '' then '姓名为空' else '法外狂徒' end; -- 法外狂徒

nullif函数

nullif(a, b) 用来检测a参数是否与b参数相等,这里的a、b参数必须是同一种数据类型,否则会报错。当a参数与b参数相等时会返回null,否则返回a参数。

可以用这个函数来检测期望以外的值,一般用于检测字符串比较多。如下:

select nullif('test', 'unexpected'); -- test
select nullif('unexpected', 'unexpected'); -- null
select nullif(233, 111); -- 233

合并字符串

string_agg 函数可以将一个字符串列合并成一个字符串,该函数需要指定分隔符,还可以指定合并时的顺序,或者是对合并列进行去重,语法如下:

STRING_AGG ( expression, separator [order_by_clause] )

  • expression 可以解析成字符串的任何有效表达式。如果是其他数据类型,需要显示转换为字符串。
  • separator 指定连接字符串的分隔符。

order_by_clause 子句是可选子句,用于指定连接字符串的顺序。语法形式如下:

ORDER BY expression1 {ASC | DESC}, […]

数据库表:
数据库表

SQL示例:

select string_agg(network, ',' order by network) as networks,name FROM app_ads_network group by name order by networks;

查询结果:
string_agg函数查询结果

STRING_AGG()函数类似与ARRAY_AGG()函数,除了返回值不同。前者返回字符串,后者返回array类型。和其他聚集函数AVG(), COUNT(), MAX(), MIN(), SUM()一样,STRING_AGG()函数通常也和group by子句一起使用。

将字符串合并成一个数组

array_agg 函数接收一个表达式,可以返回任何类型可作为数组元素的值。order by子句是可选的,用于指定聚集中处理行的顺序,其决定返回结果数组的顺序,通常也和group by一起使用实现分组,以及使用distinct去重。语法如下:

ARRAY_AGG(expression [ORDER BY [sort_expression {ASC | DESC}], […])

array_aggstring_agg 函数类似,但会把一个字符串列合并成一个数组对象,同样支持指定合并顺序和去重操作;合并成数组后意味着你可以像数组那样去读取它,需要注意的是,数据库的数组下标是从1开始的,而不是从0开始:

select array_agg(name order by name) as name FROM app_ads_network;

查询结果:

array_agg函数查询结果

通过下标获取数据:

select (array_agg(name order by name))[1] as name FROM app_ads_network;

查询结果:
在这里插入图片描述

使用distinct去重以及group by实现去重分组:

select array_agg(distinct name) as name FROM app_ads_network group by name order by name;

查询结果:

array_agg函数查询结果

该函数还可以搭配 array_to_string 函数将数组转合并成一个字符串:

select array_to_string(array_agg(distinct name order by name),'|') as name FROM app_ads_network;

查询结果:

array_to_string函数查询结果

分割字符串

string_to_array 函数可以分割字符串,返回值是一个数组:

select string_to_array(array_to_string(array_agg(distinct name order by name),'|'),'|') as name FROM app_ads_network;

查询结果:

string_to_array函数查询结果


总结

PostgreSQL STRING_AGG()函数和ARRAY_AGG()函数,前者用于使用指定的分隔符连接多个字符串,类似于MySQL的 GROUP_CONCAT函数。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/34541.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

婚礼视频mv短片制作,3分钟快速教程!教你制作婚礼开场创意视频

制作一个婚礼视频或婚礼MV短片,当下非常流行。用生活照、婚纱照片做成视频,在婚礼上当作开场或者生活中留给婚礼一个纪念,都是不错的选择。而且用照片做成视频,方法简单,但是创意依旧满满。 今天就教大家3分钟快速学会制作婚礼视频,利用生活照或婚纱照,配上数码大师里的…

SpringBoot+Redis实现接口限流

1.redis接口限流注解 定义一个注解标明需要使用限流的接口 Target(ElementType.METHOD) Retention(RetentionPolicy.RUNTIME) Documented public interface AccessLimit {/*** return 单位时间&#xff08;秒&#xff09;*/int seconds();/*** return 单位时间最大请求次数*/…

访问url图片并上传oss图片显示不完整问题解决

问题&#xff1a;在之前通过链接上传图片的时候&#xff0c;都是先获取inputStream流&#xff0c;然后通过available()方法获取文件大小。但是通过这种方法获取到的文件大小是不准确的&#xff0c;因为这个时候文件还没有读取完全&#xff0c;所以获取到的文件大小是不完全的。…

乱序执行的原理——减轻数据灾难的影响

文/Hisa Ando 处理器基本上会按照程序中书写的机器指令的顺序执行。按照书写顺序执行称为按序执行(In-Order )。按照书写顺序执行时&#xff0c;如果从内存读取数据的加载指令、除法运算指令等延迟(等待结果的时间)较长的指令后面紧跟着使用该指令结果的指令&#xff0c;就会陷…

倍福 ton_b%C3%A9ton野蛮或野蛮

倍福 ton Brutalism style mainly has emphasis on materials, textures and construction, producing highly expressive forms. Popular in the 1960s and 1970s brutalism originated post–World War II when the design of low-cost housing and government buildings wer…

每周分享第 55 期

这里记录过去一周&#xff0c;我看到的值得分享的东西&#xff0c;每周五发布。 欢迎投稿&#xff0c;或推荐你自己的项目&#xff0c;请前往 GitHub 的 ruanyf/weekly 提交 issue。 (题图&#xff1a;昆山火车站&#xff0c;苏州&#xff0c;2018) 关于 996 工作制&#xff0c…

每周分享第 34 期

这里记录过去一周&#xff0c;我看到的值得分享的东西&#xff0c;每周五发布。 欢迎投稿&#xff0c;或推荐你自己的项目&#xff0c;请前往 GitHub 的 ruanyf/weekly 提交 issue。 英国有一家叫做 BioTeq 的创业公司&#xff0c;主营业务是人体芯片&#xff0c;也就是在人的体…

OpenStack 环境配置

OpenStack 环境配置 虚拟机资源信息 1、控制节点ct CPU&#xff1a;双核双线程-CPU虚拟化开启 内存&#xff1a;8G 硬盘&#xff1a;300G 双网卡&#xff1a;VM1-&#xff08;局域网&#xff09;192.168.100.20 NAT-192.168.80.20 操作系统&#xff1a;Centos 7.6&#xff0…

那一年,我们在巴塞罗那找到的「ONES 图腾」

临近2021年岁末&#xff0c;「圣诞之星」被悬挂到圣家族大教堂第二高塔「圣母塔」之上&#xff0c;这意味着大教堂进入了最后的施工阶段。 圣家族大教堂&#xff08;简称「圣家堂」&#xff09;被称为世界上最著名的「烂尾楼」——从1882年开始修建&#xff0c;至今依然没有建成…

天正网络版修改服务器地址,修改天正网络版服务器地址

修改天正网络版服务器地址 内容精选 换一换 修改子网名称、DNS服务器地址等。当前在部分区域中,子网已从虚拟私有云中解耦,解耦后子网拥有独立入口。未解耦:在虚拟私有云详情页的“子网”页签,可对子网进行操作。本小节的操作步骤指导以此入口为例。已解耦:在进入“网络 &…

vba 怎么取得一个book中最右边的sheet名_在阴影中一心前进 | 安藤忠雄:艰难的日子里坚韧地活...

李乐贤&#xff1a;在我20岁的时候&#xff0c;对未来和专业充满了憧憬但又迷茫&#xff1b;安藤忠雄的讲座和书陪伴我度过了非常艰难的一段日子。在我们很多次想要放弃的时候&#xff0c;他人生中的求学实践经历为所有的年轻建筑师带来了启发和坚韧。很多时候 &#xff0c;我们…

计算机辅助设计还需要手绘吗,建筑设计师,还需要手绘吗?

原标题&#xff1a;建筑设计师&#xff0c;还需要手绘吗&#xff1f; 来源&#xff1a;城市建筑(ID&#xff1a;UA_2004) 本文已获授权 如今&#xff0c;你看到的建筑师的工作状态 大多是这样的 这样的 在未来还有可能是这样的 在这样一个科技越来越发达&#xff0c; 表现手法越…

科学-建筑学:建筑学百科

ylbtech-科学-建筑学&#xff1a;建筑学百科 建筑学&#xff0c;从广义上来说&#xff0c;是研究建筑及其环境的 学科。建筑学是一门横跨工程技术和人文艺术的学科。 建筑学所涉及的建筑艺术和建筑技术、以及作为实用艺术的建筑艺术所包括的美学的一面和实用的一面&#xff0c;…

黑建筑学计算机怎么样,听起来很高大上的建筑学专业,到底咋样

原标题&#xff1a;听起来很高大上的建筑学专业&#xff0c;到底咋样 专业简介 建筑学 专业介绍&#xff1a; 本专业培养适应我国社会主义经济发展和现代化建设需要&#xff0c;掌握建筑学科的基本理论、基本知识和基本设计方法&#xff0c;接受建筑师基本训练&#xff0c;具备…

谷歌打响全面反击战:AI重构搜索、新模型比肩GPT-4

作者&#xff1a;xxx&#xff0c; 图文编辑&#xff1a;xj 来源&#xff1a;公众号「xxx」 明敏 丰色 发自 凹非寺量子位 | 公众号 QbitAI 万众瞩目&#xff0c;谷歌的反击来了。 现在&#xff0c;谷歌搜索终于要加入AI对话功能了&#xff0c;排队通道已经开放。 当然这还只是第…

AutoGPT、AgentGPT、BabyAGI、HuggingGPT、CAMEL:各种基于GPT-4自治系统总结

ChatGPT和LLM技术的出现使得这些最先进的语言模型席卷了世界&#xff0c;不仅是AI的开发人员&#xff0c;爱好者和一些组织也在研究探索集成和构建这些模型的创新方法。各种平台如雨后春笋般涌现&#xff0c;集成并促进新应用程序的开发。 AutoGPT的火爆让我们看到越来越多的自…

恐怖的GPT4!我All In了!!

"GPT4 太恐怖了&#xff0c;我要All In了" "作为一个程序员&#xff0c;我能接受被淘汰&#xff0c;但是我要亲眼见证下我是怎么被淘汰的" 不止一次听到不同的人和我说类似的话了。 最近几天&#xff0c;chatGPT实在是太火了&#xff0c;火得一塌糊涂&…

chatgpt赋能python:Python新手如何兼职学习SEO技能

Python新手如何兼职学习SEO技能 随着互联网的快速发展&#xff0c;SEO技能已经成为了许多企业必备的能力。而Python作为一种强大的编程语言&#xff0c;正在被越来越多的企业所青睐。本文将介绍Python新手如何兼职学习SEO技能。 什么是SEO&#xff1f; SEO即搜索引擎优化&am…

微软:GPT-4下周发布,剑指多模态,可支持视频

白交 发自 凹非寺量子位 | 公众号 QbitAI GPT-4真的要来了&#xff01;发布时间已确定&#xff1a; 就在下周。而且还是多模态&#xff0c;可支持视频。 听到这个消息&#xff0c;网友们直接炸了锅&#xff1a;大家都准备好了吗&#xff1f; 毕竟在一部分人眼中&#xff0c;Cha…

AI又火了,这一次云厂商能赚到钱吗?

由ChatGPT带来的AI热潮还在不断涌现并升温&#xff0c;我们又将进入一个“AI之夏”&#xff0c;到底谁能赚到第一桶金呢&#xff1f;最近&#xff0c;美国著名投资机构A16Z在一篇题为《Who Owns the Generative AI Platform?&#xff08;谁能赢得生成式AI平台&#xff09;》的…