数仓的字符截取三胞胎: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 ...
随机推荐
- 腾讯云OCR服务二次开发
本文记录了对腾讯云OCR服务二次开发的代码和开发过程中遇到的问题.
- HCIE笔记-第八节-传输层协议
传输层:实现"端到端"的服务 应用到应用 端口 = port [逻辑端口] 基于应用级别的互访,就是 端口到端口的互访. 传输层 = 0-65535[端口范围] === TCP/U ...
- KotlinMall实战之注册部分MVP架构配置
包目录如下: ①BaseView部分:基本的回调 interface BaseView { fun showLoading() fun hideLoading() fun onError()} ②Ba ...
- vite创建vue3+ts项目流程
vite+vue3+typescript搭建项目过程 vite和vue3.0都出来一段时间了,尝试一下搭vite+vue3+ts的项目 相关资料网址 vue3.0官网:https://v3.vue ...
- [STL] vector 可变数组
点击查看代码 #include<iostream> #include<vector> using namespace std; int main() { // 初始化 a 为 ...
- [AcWing 35] 反转链表
迭代版本 点击查看代码 /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next ...
- 阿里CBU技术面试小结
一个执着于技术的公众号 前言 今天给大家分享一篇胡文兴同学阿里CBU技术面试的自我总结,希望通过本篇文章也让正在准备求职面试的你有所帮助. 本篇文章已经征得原作者同意转载至本公众号,并且征得他的同意标 ...
- 掌握AI学习路上核心理论知识,你绝对不能错过这份最全资料包
人工智能成为当下科技发展的代表之一,持续受到了不少追捧,不管你是否是这一专业的学生或者职场人,学习并掌握一项新潮技能总是不会被同龄人淘汰的.我曾经问过别人.也被别人问过关于学习人工智能(AI)最好的方 ...
- 使用NFS作为Glance存储后端
NFS服务介绍 NFS网络文件系统提供了一种在类UNIX系统上共享文件的方法.目前NFS有3个版本:NFSv2.NFSv3.NFSv4.CentOS7默认使用NFSv4提供服务,优点是提供了有状态的连 ...
- line-height和height关系
如图所示,line-height = font-size + 上下本行距.上下半行距总是相等.font-size居于中间.当font-size值固定时,line-height越大,半行距越大.所以当l ...