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