89407707 2020-06-10
一、字符串处理函数
1.1字符串操作符
PostgreSQL对于字符串的操作符,支持关系型数据库中通用的符号 ||,用来多个字符串之间或者空字符和多个字符串之间的连接。
示例:
hrdb=# -- || 为字符串连接操作符 hrdb=# SELECT ‘Postgre‘ || ‘SQL‘ AS result; result ------------ PostgreSQL (1 row) hrdb=# SELECT ‘PostgreSQL‘ || ‘ ‘ || ‘is most advanced open source ORDBMS !‘ AS result; result -------------------------------------------------- PostgreSQL is most advanced open source ORDBMS ! (1 row)
1.2字符串函数
字符串位数长度函数
bit_length(string)
返回字符串在数据库中的位数长度
示例:
hrdb=# --字符串位数函数 bit_length(string) hrdb=# SELECT bit_length(‘PostgreSQL‘) AS result; result -------- 80 (1 row)
统计字符长度函数
char_length(string) 或 character_length(string)
返回传入字符串的字符个数
示例:
hrdb=# --字符串字符长度函数 char_length() 或 character_length() hrdb=# SELECT char_length(‘PostgreSQL‘) AS result; result -------- 10 (1 row) hrdb=# SELECT character_length(‘PostgreSQL 12‘) AS result; result -------- 13 (1 row)
温馨提示:
注意,使用该函数统计字符串字符长度,将包含空白字符,如果需要将空白字符排除统计,需要做相应的处理。
大小写转换函数
lower(string) 和upper(string)
返回将传入的字符串转换成大(小)写
示例:
hrdb=# --大小写转换函数 lower()和upper hrdb=# SELECT lower(‘POSTGRESQL‘) AS result; result ------------ postgresql (1 row) hrdb=# SELECT upper(‘postgresql‘) AS result; result ------------ POSTGRESQL (1 row)
字符串首字母转换为大写函数
initcap(string)
返回传入字符串的首字母为大写的字符串
示例:
hrdb=# --字符串首字母大写函数 initcap() hrdb=# SELECT initcap(‘postgreSQL‘) AS result; result ------------ Postgresql (1 row)
替换子串函数
overlay()
返回将起始位置到结束位置使用指定的子串替换
示例:
hrdb=# --将起始位置到结束位置的字符使用指定的字符替换 hrdb=# SELECT overlay(‘Postgresql‘ placing ‘SQL‘ from 8 for 10); overlay ------------ PostgreSQL (1 row) hrdb=# --使用该函数如果没有指定结束位置,将根据指定字符串长度 hrdb=# --进行替换 hrdb=# SELECT overlay(‘http://www.google.com‘ placing ‘https‘ from 1); overlay ----------------------- https//www.google.com (1 row)
字符串所占字节统计函数
octet_length()
返回字符串所占字节的长度
示例:
--返回字符串所占字节长度函数 octet_length() SELECT octet_length(‘PostgreSQL‘) AS result; SELECT octet_length(‘开源数据库‘) AS result;
温馨提示:
对于中文字符,PostgreSQL 默认使用 UTF8 编码,一个中文占用3个字节。
查找指定字符或字符串在字符串中的位置函数
position()
示例:
hrdb=# --查找指定字符或字符串在字符串中的位置函数 hrdb=# SELECT position(‘pos‘ in ‘$PGDATA/postgresql‘) AS result; result -------- 9 (1 row)
按指定的位置截取指定字符或字符串函数
substring() 或 substr()
示例:
hrdb=# --按指定的位置截取指定字符或字符串函数 substring() 或 substr() hrdb=# SELECT substring(‘https://www.baidu.com‘,9) AS result; result --------------- www.baidu.com (1 row) hrdb=# SELECT substr(‘https://www.baidu.com‘,9,21) AS result; result --------------- www.baidu.com (1 row)
温馨提示:
通常,position函数和substring函数会一起集合使用,方便批量处理字符串。
hrdb=> SELECT substring(‘https://www.baidu.com‘,position(‘w‘ in ‘https://www.baidu.com‘)) as result; result --------------- www.baidu.com
移除字符串两端多余的字符函数
trim([leading | trailing|both] [characters] from string)
其中参数
leading | trailing | both 表示
移除
开头 | 结尾 | 两端 的字符,默认为 both
leading 相当于 ltrim()函数,表示左移除
trailing 相当于 rtrim()函数,表示右移除
both 相当于 btrim()函数,表示两端移除
示例:
hrdb=> --移除字符串两端多余的字符函数 trim() hrdb=> --其中参数leading | trailing | both 表示 hrdb=> --移除开头 | 结尾 | 两端 的字符串,默认为 both hrdb=> --leading 相当于 ltrim()函数,表示左移除 hrdb=> --trailing 相当于 rtrim()函数,表示右移除 hrdb=> SELECT trim(‘rdb ms‘ from ‘rdb PostgreSQL ms‘) AS result; result ------------ PostgreSQL (1 row) hrdb=> SELECT trim(leading ‘rdb ms‘ from ‘rdb PostgreSQL ms‘) AS result; result --------------- PostgreSQL ms (1 row) hrdb=> SELECT trim(trailing ‘rdb ms‘ from ‘rdb PostgreSQL ms‘) AS result; result ---------------- rdb PostgreSQL (1 row) hrdb=> SELECT ltrim(‘rdb PostgreSQL ms‘,‘rdb ms‘) AS result; result --------------- PostgreSQL ms (1 row) hrdb=> SELECT rtrim(‘rdb PostgreSQL ms‘,‘rdb ms‘) AS result; result ---------------- rdb PostgreSQL (1 row)
字符转换为ASCII码函数
ascii()
返回指定字符的 ascii码值
示例:
hrdb=> --返回指定字符的ASCII码值函数 ascii() hrdb=> SELECT ascii(‘S‘) AS result; result -------- 83 (1 row) hrdb=> SELECT ascii(‘a‘) AS result; result -------- 97 (1 row)
替换字符串函数
replace()
返回将字符串中出现的字符使用指定的子串替换
示例:
hrdb=> --返回将字符串中出现的字符使用指定的子串替换函数 replace() hrdb=> SELECT replace(‘http://www.baidu.com‘,‘http‘,‘https‘) AS result; result ----------------------- https://www.baidu.com (1 row) hrdb=> SELECT replace(‘南京的风向吹向南面‘,‘南‘,‘北‘) AS result; result -------------------- 北京的风向吹向北面 (1 row)
将字符对应的ascii码值转换为字符函数
chr()
返回指定ascii 码对应的字符
示例:
hrdb=> --返回指定ascii 码对应的字符函数 chr() hrdb=> -- 39 表示一个单引号 hrdb=> SELECT chr(39) || first_name || chr(39) AS first_name hrdb-> FROM employees limit 1; first_name ------------ ‘Steven‘ (1 row) hrdb=> -- 10 表示一个换行符号 hrdb=> SELECT replace(t.txt,chr(10),‘ ‘) as result hrdb-> FROM hrdb-> (SELECT ‘PostgreSQL hrdb‘> is most hrdb‘> advanced open source rdbms hrdb‘> ‘ as txt) as t; result ------------------------------------------------ PostgreSQL is most advanced open source rdbms (1 row) hrdb=> -- 32 表示一个空格符号 hrdb=> SELECT replace(t.txt,chr(32),‘|‘) hrdb-> FROM hrdb-> (SELECT ‘a b‘ AS txt) t; replace ------------ a||||||||b (1 row)
温馨提示:
chr(9) 表示一个水平制表符,chr(11)表示一个垂直制表符,chr(13)表示一个回车符号。通常chr() 函数结合replace()函数一起使用,示例如上。
字符串拼接函数
concat()
将任何的字符串拼接,包括null值
示例:
hrdb=> --字符串拼接函数 concat() hrdb=> SELECT concat(‘https‘,null,‘://‘,‘www‘,‘.‘,‘google‘,‘.‘,‘com‘) AS result; result ------------------------ https://www.google.com
多个字符串拼接并按照指定的格式进行分隔函数
concat_ws()
使用第一个参数作为分隔符,将多个字符串按照第一个参数的分隔方式,将字符串分隔。null作为第一个参数来分隔字符串,将被忽略。
示例:
hrdb=> --字符串拼接分隔函数 concat_ws() hrdb=> SELECT concat_ws(chr(9),‘Huawei‘,‘5885H‘) AS result; result --------------- Huawei 5885H (1 row)
转换字符串编码函数
convert(string,src_encoding,dest_encoding)
将字符串转换为不同的编码,src_encoding表示源编码,dest_encoding表示要转换的编码
示例:
hrdb=> --字符串编码转换函数 hrdb=> SELECT convert(‘postgresql‘,‘UTF8‘,‘LATIN1‘) AS result; result ------------------------ \x706f737467726573716c (1 row)
编码和解码函数
decode() 和 encode()
将指定的字符串(或者二进制数据类型)转换为二进制数据类型(或字符串)
示例:
hrdb=> --编码解码函数 encode() decode() hrdb=> SELECT decode(md5(‘PostgreSQL‘),‘base64‘) AS result; result ---------------------------------------------------- \xdfdf5b77579ee7cef6e3979c69ce9fdfd6de69af7df3ce9f (1 row) hrdb=> SELECT encode(‘\xdfdf5b77579ee7cef6e3979c69ce9fdfd6de69af7df3ce9f‘,‘base64‘) AS result; result ---------------------------------- 399bd1ee587245ecac6f39beaa99886f (1 row)
温馨提示:
编码解码的格式有 base64,hex,escape
格式化输出函数
format()
将字符串以类C语言的格式输出
示例:
hrdb=> --格式化输出函数 format() hrdb=> SELECT format(‘PostgreSQL %s %2$s %3$s ‘,‘is‘,‘most‘,‘popular‘,‘database‘) AS result; result ----------------------------- PostgreSQL is most popular (1 row)
返回指定位置左边的字符串
left()
返回指定位置左边的字符串,如果指定的位置是一个负数,则从右边开始截取
示例:
hrdb=> --返回指定位置字符串左边的字符函数 left() hrdb=> SELECT left(‘https://www.baidu.com‘,5) AS result; result -------- https (1 row) hrdb=> SELECT left(‘https://www.baidu.com‘,-13) AS result; result ---------- https:// (1 row)
返回指定位右边的字符串
left()
返回指定位置右边的字符串,如果指定的位置是一个负数,则从左边开始截取
示例:
hrdb=> --返回指定位置字符串右左边的字符函数 left() hrdb=> SELECT right(‘https://www.baidu.com‘,13) AS result; result --------------- www.baidu.com (1 row) hrdb=> SELECT right(‘https://www.baidu.com‘,-5) AS result; result ------------------ ://www.baidu.com
字符串填充函数
lpad()和 rpad() 表示左填充和右填充
返回超过字符串本身长度的字符将以指定的字符填充
示例:
--字符串填充函数 lpad() rpad() --分别将employees表中的first_name列设置为右对齐 --将salary列设置为左对齐 hrdb=> SELECT lpad(first_name,15,‘-‘) as first_name, hrdb-> rpad(salary::varchar,10,‘+‘) as salary hrdb-> FROM employees LIMIT 2; first_name | salary -----------------+------------ ---------Steven | 24000.00++ ----------Neena | 17000.00++
指定位置字符串分隔函数
split_part()
将字符串从指定的位置进行分隔并返回指定位置分隔的字符串
示例:
hrdb=> --指定位置字符串分隔函数 hrdb=> SELECT split_part(‘https://www.baidu.com‘,‘//‘,2) AS result; result --------------- www.baidu.com (1 row)
以字符为单位一一替换函数
translate()
以字符为单位将字符串中的字符一一替换
示例:
hrdb=> --以字符为单位一一替换函数 hrdb=> SELECT translate(‘Postgr2e3S4QL‘,‘123456789‘,‘‘) AS result; result ------------ PostgreSQL (1 row)
1.3字符串处理函数的实际应用案例
将字符串中的每一个字符循环打印出来。此时要涉及到字符串的遍历,大家知道在过程化语言中如Oracle中的 PL/SQL 还是 PostgreSQL中的 PL/PGSQL,要遍历字符串非常容易,使用for循环就可以遍历,但是在 SQL 语句中要实现字符串的循环输出如何做呢?
示例:将 PostgreSQL 循环遍历输出
hrdb=> SELECT substring(t1.txt,t2.id) AS col1, hrdb-> substring(t1.txt,char_length(t1.txt) - t2.id + 1) AS col2, hrdb-> left(t1.txt,t2.id) AS col3, hrdb-> right(t1.txt,t2.id) AS col4 hrdb-> FROM hrdb-> (SELECT ‘PostgreSQL‘ AS txt) t1 hrdb-> JOIN hrdb-> (SELECT id hrdb(> FROM generate_series(1,10) id) t2 ON (t2.id != 0); col1 | col2 | col3 | col4 ------------+------------+------------+------------ PostgreSQL | L | P | L ostgreSQL | QL | Po | QL stgreSQL | SQL | Pos | SQL tgreSQL | eSQL | Post | eSQL greSQL | reSQL | Postg | reSQL reSQL | greSQL | Postgr | greSQL eSQL | tgreSQL | Postgre | tgreSQL SQL | stgreSQL | PostgreS | stgreSQL QL | ostgreSQL | PostgreSQ | ostgreSQL L | PostgreSQL | PostgreSQL | PostgreSQL (10 rows)
作者:宋少华
PostgreSQL分会培训认证委员会委员、晟数科技首席技术专家、晟数学院金牌讲师、oracle 11g OCM、PostgreSQL首批PGCE。
曾服务于国家电网冀北电力有限公司建设大数据平台,为人社局和北京市卫计委构建IT基础服务,为多家银行和证券公司构建web 服务器,系统及数据库维护;具有对税务局、国家电网、银行等政府行业和民营企业的IT培训经验;为相关安全行业设计DW数据仓库模型,使用PostgreSQL,Greenplum,HUAWEIGaussDB,Vertica和Clickhouse 做数据基础服务,开发TB级数据落地程序及百TB级别数据迁移程序。