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

 

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章