數倉的字元截取三胞胎: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()的差異和用法,日常使用中,如果遇到截取字元串為多位元組字元,或者截取參數可能為特殊值的情況,那你就要特別注意了;這篇文章,希望能幫到迷茫的你!

 

點擊關注,第一時間了解華為雲新鮮技術~