写点什么

数仓的字符截取三胞胎:substrb、substr、substring

  • 2022 年 6 月 27 日
  • 本文字数:1581 字

    阅读完需:约 5 分钟

数仓的字符截取三胞胎:substrb、substr、substring

本文分享自华为云社区《GaussDB(DWS)中的字符截取三胞胎》,作者:我站在北方的天空下 。


在 GaussDB(DWS)中关于字符截取功能的支持有个函数三胞胎,它们分别是 substrb()、substr()、substring(),很多人大概只知道它们可以操作字符串截取,再深入一点可能就不是很清楚了,有的是参数截取长度、有的参数是结束位置、有的参数可以是负数、有的不能接受负数参数······


下面就来给大家介绍这三个函数在字符截取时的一些用法与区别吧。

概述


substr,substrb,substring 均为字符串截取函数,都可带两个或三个参数,用于提取字符串中指定位置开始的指定长度的字符。函数定义如下:


函数形式:    substrb(string, from [, count])    substr(string, from [, count])    substring(string, from [, count])参数描述:	从参数string中抽取子字符串,from表示抽取的起始位置,count表示抽取的子字符串长度。返回值类型:	text
复制代码

差异

1. 截取单位


substrb 按字节截取,substr/substring 按字符截取。以 utf8 编码为例,1 个汉字占 3 个字节,当使用 substrb 截取长度 3 的子串时,只能截取到一个字符,而 substr/substring 可以截取到三个字符。



postgres=# select substrb('hwgs华为公司',3,5),substr('hwgs华为公司',3,5),substring('hwgs华为公司',3,5); substrb |  substr  | substring---------+----------+----------- gs华    | gs华为公 | gs华为公(1 row)
复制代码

2. 截取规则


GaussDB(DWS)目前支持三种兼容模式:ORA、TD 和 MySQL,分别对友商的函数行为进行兼容,提升用户迁移体验。在不同兼容模式下,函数差异表现为:


substrb(string, s[, n]):各兼容模式行为一致



postgres=# select substrb('hwgs华为公司',5,3),substrb('hwgs华为公司',8,3); substrb | substrb---------+--------- 华      | 为(1 row)postgres=# select substrb('hwgs华为公司',-6,3),substrb('hwgs华为公司',-3,3); substrb | substrb---------+--------- 公      | 司(1 row)postgres=# select substrb('hwgs华为公司',5,0),substrb('hwgs华为公司',8,-1); substrb | substrb---------+---------         |(1 row)
复制代码


substr(string, s[, n]):s=0 时存在兼容行为差异



postgres=# select substr('hwgs华为公司',5,3),substr('hwgs华为公司',8,3); substr | substr--------+-------- 华为公 | 司(1 row)postgres=# select substr('hwgs华为公司',0,3),substr('hwgs华为公司',0,3); substr | substr--------+-------- hwg    | hwg(1 row)mysql_db=# select substr('hwgs华为公司',0,3),substr('hwgs华为公司',0,3); substr | substr--------+--------        |(1 row)
复制代码


substring(string, s[, n]):s<=0 和 n<0 时存在兼容行为差异



postgres=# select substring('hwgs华为公司',0,3),substring('hwgs华为公司',-1,3); substring | substring-----------+----------- hw        | h(1 row)td_db=# select substring('hwgs华为公司',0,3),substring('hwgs华为公司',-1,3); substring | substring-----------+----------- hw        | h(1 row)
mysql_db=# select substring('hwgs华为公司',0,3),substring('hwgs华为公司',-1,3); substring | substring-----------+----------- | 司(1 row)td_db=# select substring('hwgs华为公司',0,-1);ERROR: negative substring length not allowedCONTEXT: referenced column: substringmysql_db=# select substring('hwgs华为公司',0,-1); substring-----------
(1 row)
复制代码

小结


综上,详细介绍并总结了 substrb()、substr()、substring()的差异和用法,日常使用中,如果遇到截取字符串为多字节字符,或者截取参数可能为特殊值的情况,那你就要特别注意了;这篇文章,希望能帮到迷茫的你!


点击关注,第一时间了解华为云新鲜技术~

发布于: 刚刚阅读数: 4
用户头像

提供全面深入的云计算技术干货 2020.07.14 加入

华为云开发者社区,提供全面深入的云计算前景分析、丰富的技术干货、程序样例,分享华为云前沿资讯动态,方便开发者快速成长与发展,欢迎提问、互动,多方位了解云计算! 传送门:https://bbs.huaweicloud.com/

评论

发布
暂无评论
数仓的字符截取三胞胎:substrb、substr、substring_数据库_华为云开发者联盟_InfoQ写作社区