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}, […]

数据库表:
PostgreSQL 字符串函数汇总_第1张图片

SQL示例:

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

查询结果:
PostgreSQL 字符串函数汇总_第2张图片

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;

查询结果:

PostgreSQL 字符串函数汇总_第3张图片

该函数还可以搭配 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函数。

你可能感兴趣的:(#,PostgreSQL,postgresql,数据库,sql)