字符截取函数substrb()、substr()及substring()的用法及差异
GaussDB(DWS)支持字符截取功能的函数:substrb()、substr()和substring(),这些函数都可以操作字符串截取,但在字符截取时的用法和差异是什么呢,本节进行详细介绍。
函数形式
substrb()、substr()和substring()均为字符串截取函数,都可带两个或三个参数,用于提取字符串中指定截取的开始位置和截取的长度。函数定义如下:
1 2 3 |
substrb(string, from [, count]) substr(string, from [, count]) substring(string, from [, count]) |
参数描述:从参数string中抽取子字符串,from表示抽取的起始位置,count表示抽取的字符串长度。
返回值类型:text
截取单位差异
- substrb(),按字节截取。
- substr(),按字符截取。
- substring(),按字符截取。
以utf8编码为例,1个汉字占3个字节,当使用substrb()截取长度3的子串时,只能截取到一个字符,而substr()/substring()可以截取到三个字符。
示例:
1 2 3 4 |
SELECT substrb('data数据库',3,5),substr('data数据库',3,5),substring('data数据库',3,5); substrb | substr | substring ---------+----------+----------- ta数 | ta数据库 | ta数据库 |
截取规则差异
GaussDB(DWS)目前支持三种兼容模式:ORA、TD和MySQL,在不同兼容模式下,函数差异具体如下:
- substrb()与ORA、TD和MySQL兼容模式行为一致。
1
substrb(string, from [, count])
从参数string中抽取子字符串,from表示抽取的起始位置,count表示抽取的字符串长度。
可以表示为substrb(string, s[, n]):from的起始位置用s表示,count抽取的字符长度用n来表示。
表1 substrb()与ORA、TD和MySQL兼容模式行为 参数场景
ORA/TD/MySQL兼容
示例
s > 0
从第s个字符位置开始,截取n个字节
1 2 3 4 5
select substrb('data数据库',5,3); substrb --------- 数 (1 row)
s = 0
截取前n个字节
1 2 3 4 5
select substrb('data数据库',0,3); substrb --------- dat (1 row)
s < 0
从倒数第|s|个字节位置开始,截取n个字节
1 2 3 4 5
select substrb('data数据库',-3,3); substrb --------- 库 (1 row)
n > 0
截取n个字节
1 2 3 4 5
select substrb('data数据库',1,3); substrb --------- dat (1 row)
n <= 0
空串(ORA模式输出null)
1 2 3 4 5
select substrb('data数据库',5,0),substrb('data数据库',5,-1); substrb | substrb ---------+--------- | (1 row)
- substr()与ORA、TD和MySQL兼容模式行为差异。
1
substr(string, from [, count])
从参数string中抽取子字符串,from表示抽取的起始位置,count表示抽取的字符串长度。
可以表示为substr(string, s[, n]):from的起始位置用s表示,count抽取的字符长度用n来表示。
s=0时存在兼容行为差异。
表2 substr()与ORA、TD和MySQL兼容模式行为 参数场景
ORA兼容
TD兼容
MySQL兼容
s > 0
从第s个字符位置开始,截取n个字节
从第s个字符位置开始,截取n个字符
从第s个字符位置开始,截取n个字符
s = 0
截取前n个字节
1 2 3 4 5
ora_db=> select substr('data数据库',0,3); substr -------- dat (1 row)
截取前n个字符
1 2 3 4 5
td_db=> select substr('data数据库',0,3); substr -------- dat (1 row)
空串
1 2 3 4 5
mysql_db=> select substr('data数据库',0,3); substr -------- (1 row)
s < 0
从倒数第|s|个字节位置开始,截取n个字节
从倒数第|s|个字符位置开始,截取n个字符
从倒数第|s|个字符位置开始,截取n个字符
n > 0
截取n个字节
截取n个字符
截取n个字符
n <= 0
null
空串
空串
- substring()与ORA、TD和MySQL兼容模式行为差异。
1
substring(string, from [, count])
从参数string中抽取子字符串,from表示抽取的起始位置,count表示抽取的字符串长度。
substring(string, s[, n]):from的起始位置用s表示,count抽取的字符长度用n来表示。
s<=0和n<0时存在兼容行为差异。
表3 substring()与ORA、TD和MySQL兼容模式行为 参数场景
ORA兼容
TD兼容
MySQL
兼容
s > 0
从第s个字符位置开始,截取n个字节
从第s个字符位置开始,截取n个字符
从第s个字符位置开始,截取n个字符
s = 0
截取前n - 1个字节
1 2 3 4 5
ora_db=> select substring('data数据库',0,3); substring ----------- da (1 row)
截取前n - 1个字符
1 2 3 4 5
td_db=> select substring('data数据库',0,3); substring ----------- da (1 row)
空串
1 2 3 4 5
mysql_db=> select substring('data数据库',0,3); substring ----------- (1 row)
s < 0
截取前s + n - 1个字节
1 2 3 4 5
ora_db=> select substring('data数据库',-1,3); substring ----------- d (1 row)
截取前s + n - 1个字节
1 2 3 4 5
td_db=> select substring('data数据库',-1,3); substring ----------- d (1 row)
从倒数第|s|个字符位置开始,截取n个字符
1 2 3 4 5
mysql_db=> select substring('data数据库',-1,3); substring ----------- 库 (1 row)
n > 0
截取n个字节
截取n个字符
截取n个字符
n = 0
null
空串
空串
n < 0
报错
1 2 3
ora_db=> select substring('data数据库',3,-1); ERROR: negative substring length not allowed CONTEXT: referenced column: substring
报错
1 2 3
td_db=> select substring('data数据库',3,-1); ERROR: negative substring length not allowed CONTEXT: referenced column: substring
空串
1 2 3 4 5
mysql_db=> select substring('data数据库',3,-1); substring ----------- (1 row)
数据库使用 所有常见问题
- 如何调整分布列?
- 如何查看和设置数据库的字符集编码格式
- 如何处理建表时date类型字段自动转换为timestamp类型的问题?
- 是否需要定时对常用的表做VACUUM FULL和ANALYZE操作?
- GaussDB(DWS)数据库设置主键后还需要设置分布键吗?
- GaussDB(DWS)是否兼容PostgreSQL的存储过程?
- 如何理解分区表、数据分区和分区键?
- 如何导出某张表结构?
- 是否有高效的删除表数据的方法?
- 如何查看外部表信息?
- 如果建表时没有指定分布列,数据会怎么存储?
- 如何将联结查询的null结果替换成0?
- 如何查看表是行存还是列存?
- GaussDB(DWS)列存表的常用信息查询
- GaussDB(DWS)查询时索引失效场景解析
- 如何使用自定义函数改写CRC32()函数
- 以pg_toast_temp*或pg_temp*开头的Schema是什么?
- GaussDB(DWS)查询时结果不一致的常见场景和解决方法
- 哪些系统表不能做VACUUM FULL
- 语句处于idle in transaction状态常见场景
- GaussDB(DWS)如何实现行转列及列转行?
- 唯一约束和唯一索引有什么区别?
- 函数和存储过程有什么区别?
- 字符截取函数substrb()、substr()及substring()的用法及差异
- 如何删除重复的表数据?
more