数仓的字符截取三胞胎: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 allowed
CONTEXT: referenced column: substring
mysql_db=# select substring('hwgs华为公司',0,-1);
substring
-----------
(1 row)
小结
综上,详细介绍并总结了substrb()、substr()、substring()的差异和用法,日常使用中,如果遇到截取字符串为多字节字符,或者截取参数可能为特殊值的情况,那你就要特别注意了;这篇文章,希望能帮到迷茫的你!
数仓的字符截取三胞胎:substrb、substr、substring的更多相关文章
- js-DOM ~ 05. Date日期的相关操作、string、查字符串的位置、给索引查字符、字符串截取slice/substr/substring、去除空格、替换、大小写、Math函数、事件绑定、this
内置对象: 语言自带的对象/提供了常用的.基本的功能 打印数组和字符串不用for... in / 打印josn的时候采用for...in Date 获取当前事件: var date = ...
- Oracle substr() 字符截取函数
1.substr函数格式 (俗称:字符截取函数) 格式1: substr(string string, int a, int b); 格式2:substr(string string, int a ...
- ETL数仓测试
前言 datalake架构 离线数据 ODS -> DW -> DM https://www.jianshu.com/p/72e395d8cb33 https://www.cnblogs. ...
- js字符串截取函数slice()、substring()、substr()
摘要 在js中字符截取函数有常用的三个slice().substring().substr()了,下面我来给大家介绍slice().substring().substr()函数在字符截取时的一些用法与 ...
- mysql根据字符截取字符串(总结)
mysql根据字符截取字符串(总结) 1.1 前言 为结合自己平常查资料的习惯,我会先给出例子,然后再对相关知识进行详解.该案例使用到的函数为:SUBSTRING_INDEX 1.2 需要实现的实 ...
- JavaScript中字符串截取函数slice()、substring()、substr()
在js中字符截取函数有常用的三个slice().substring().substr()了,下面我来给大家介绍slice().substring().substr()函数在字符截取时的一些用法与区别吧 ...
- PHP截取字符串函数substr()函数实例用法详解
在PHP中有一项非常重要的技术,就是截取指定字符串中指定长度的字符.PHP对于字符串截取可以使用PHP预定义函数substr()函数来实现.下面就来介绍一下substr()函数的语法及其应用. sub ...
- 字符截取 支持UTF8/GBK
); $n = $tn = $noc = ; || $t == || ( <= $t && $t <= )) { ...
- Hive 数仓中常见的日期转换操作
(1)Hive 数仓中一些常用的dt与日期的转换操作 下面总结了自己工作中经常用到的一些日期转换,这类日期转换经常用于报表的时间粒度和统计周期的控制中 日期变换: (1)dt转日期 to_date(f ...
随机推荐
- Java语言学习day09--7月08日
今日内容介绍 1.方法基础知识 2.方法高级内容 3.方法案例 ###01方法的概述 * A: 为什么要有方法 * 提高代码的复用性 * B: 什么是方法 ...
- SpringAOP的源码解析
一.SpringAOP的概念 一.AOP的基本概念 1.连接点(Joinpoint):可以被增强的方法. 2.切点(Pointcut):实际被增强的方法. 3.通知(Advice)(增强): 3.1. ...
- 百度AI人脸检测——解析JSON 数据格式
1.了解一下 通常情况下,每个需要访问网络的应用程序都会有一个自己的服务器,我们可以向服务器提交数据,也可以从服务器上获取数据.不过这个时候就出现了一个问题,这些数据到底要以什么样的格式在网络上传输呢 ...
- 最新Mysql大厂面试必会的34问题
目录 1.mysql的隔离级别 2.MYSQL性能优化 常用5种方式 3.索引详解 1.何为索引,有什么用? 2.索引的优缺点 4.什么情况下需要建索引? 5.什么情况下不建索引? 6.索引的底层数据 ...
- MySQL基础合集
我的小站 1.MySQL的优势 运行速度快 使用成本低 可移植性强 适用用户广 2.MySQL的运行机制 一个SQL语句,如select * from tablename ,从支持接口进来后,进入连 ...
- 项目完成 - 基于Django3.x版本 - 开发部署小结
前言 最近因为政企部门的工作失误,导致我们的项目差点挂掉,客户意见很大,然后我们只能被动进入007加班状态,忙得嗷嗷叫,直到今天才勉强把项目改完交付,是时候写一个小结. 技术 因为前期需求不明确,数据 ...
- 攻防世界-MISC:SimpleRAR
这是攻防世界新手练习区的第十题,题目如下: 点击下载附件1,是一个RAR文件,解压一下,得到flag.txt文件,激动的点进去看一下 好吧,就知道没有这么简单,用010editor打开这个RAR文件, ...
- XCTF练习题---WEB---view_source
XCTF练习题---WEB---view_source flag:cyberpeace{662b1cf989a0a7999a5589290ce5a88e} 解题步骤: 1.观察题目,打开场景 2.根据 ...
- JQ的is()
is():根据选择器.元素或jQuery对象来检测匹配元素集合, 如果这些元素中至少有一个元素匹配给定的参数,则返回true. <!DOCTYPE html> <html lang ...
- Flutter异步与线程详解
一:前言 - 关于多线程与异步 关于 Dart,我相信大家都知道Dart是一门单线程语言,这里说的单线程并不是说Dart没有或着不能使用多线程,而是Dart的所有API默认情况下都是单线程的.但大家也 ...