数仓的字符截取三胞胎:substrb、substr、substring
字符 截取 数仓 substring substr
2023-09-27 14:20:00 时间
摘要:下面就来给大家介绍这三个函数在字符截取时的一些用法与区别。
本文分享自华为云社区《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 allowed CONTEXT: referenced column: substring mysql_db=# select substring('hwgs华为公司',0,-1); substring ----------- (1 row)
小结
综上,详细介绍并总结了substrb()、substr()、substring()的差异和用法,日常使用中,如果遇到截取字符串为多字节字符,或者截取参数可能为特殊值的情况,那你就要特别注意了;这篇文章,希望能帮到迷茫的你!
相关文章
- 算法基础:删除字符串中出现次数最少的字符(Golang实现)
- hdu 5284 wyh2000 and a string problem(没有算法,仅仅考思维,字符数组得开20万,不然太小了)
- WEB只能输入固定的字符
- 字符编码详解
- 生成二维码 加密解密类 TABLE转换成实体、TABLE转换成实体集合(可转换成对象和值类型) COOKIE帮助类 数据类型转换 截取字符串 根据IP获取地点 生成随机字符 UNIX时间转换为DATETIMEDATETIME转换为UNIXTIME 是否包含中文 生成秘钥方式之一 计算某一年 某一周 的起始时间和结束时间
- shell 获取字符串前两个字符串、获取字符串最后一个字符、去掉字符串最后一个字符、去掉末尾一个字符、去掉末尾两个字符
- 【算法】【字符串模块】添加最少字符使得当前字符变成回文字符串
- 系统学习JAVA第十七天(字节流、字符流、缓冲的字节流、缓冲的字符流、将字节流转换为缓冲的字符流、面向对象——>字节流转成对象)
- 【Excel】+根据指定字符截取数据
- java统计英文字母、空格、数字和其它字符的数目
- 【C语言】删除指定字符
- java IO(三):字符流
- Delphi 字符型数据
- UTF8有很明显的特征:如果最高字节为0,则表示一个英文字符(与ASCII完全相同)。如果有2个以上1,表示是首个字节。如果最高位是10,则表示一个中间字节。
- 《C语言解惑》—— 1.1 中文字符以假乱真
- (JAVA编程练习):输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
- mysql—将字符型数字转成数值型数字
- Linux中的expr工具(获取字符串长度,截取字符串,获取字符串中第一个字符出现的位置)
- 浅析为什么使用正则RegExp.test( )方法时第一次是true第二次却是false(产生原因、lastIndex属性介绍、解决方案-去掉全局匹配、重置lastIndex属性、使用match替换test)、正则表达式匹配任意字符、语法错误Uncaught SyntaxError: Invalid regular expression-Nothing to repeat的原因
- python第二周数据类型 字符编码 文件处理
- C# 中的转译字符'/b'
- 截取中文字符长度(中文、字母都有效)
- 【python养成】:案例(判断素数、统计字符串中的大写字母、小写字母、数字、其他字符的个数、整数之和、模拟内置函数)