SUBSTRING 函數 - Amazon Redshift

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

SUBSTRING 函數

根據指定的開始位置返回字符串的子集。

如果輸入為字串,則抽取的字元數以字元為基礎,而不是位元組,所以多位元組字元視為單一字元。如果輸入是二進制表達式,則開始位置和提取的子字符串基於字節。您不能指定負長度,但可以指定負的開始位置。

Syntax (語法)

SUBSTRING(character_string FROM start_position [ FOR number_characters ] )
SUBSTRING(character_string, start_position, number_characters )
SUBSTRING(binary_expression, start_byte, number_bytes )
SUBSTRING(binary_expression, start_byte )

引數

字符串

供進行搜尋的字串。非字元資料類型視為字串。

start_position

在字串內要開始擷取的位置,從 1 開始。start_position 以字元數為基礎,而不是位元組,所以多位元組字元視為單一字元。這可以是負數。

number_characters

要擷取的字元數 (子字串的長度)。number_characters 以字元數為基礎,而不是位元組,所以多位元組字元視為單一字元。這不能是負數。

二進制表達式

要搜索的數據類型 VARBYTE 的二進制表達式。

起始字節

在二進制表達式中要開始抽取的位置,從 1 開始。這可以是負數。

數字字節

要抽取的字節數,即子字串的長度。這不能是負數。

傳回類型

VARCHAR 或變量字節取決於輸入。

字符串的使用説明

下列範例傳回從第六個字元開始的四個字元的字串。

select substring('caterpillar',6,4); substring ----------- pill (1 row)

如果 start_position + number_characters 超過 string 的長度,SUBSTRING 會傳回從 start_position 開始到字串結尾的字串。例如:

select substring('caterpillar',6,8); substring ----------- pillar (1 row)

如果 start_position 是負數或 0,SUBSTRING 函數會傳回從字串第一個字元開始且長度為 start_position + number_characters -1 的子字串。例如:

select substring('caterpillar',-2,6); substring ----------- cat (1 row)

如果 start_position + number_characters -1 小於或等於零,SUBSTRING 會傳回空字串。例如:

select substring('caterpillar',-5,4); substring ----------- (1 row)

範例

下列範例從 LISTING 資料表的 LISTTIME 字串中傳回月份:

select listid, listtime, substring(listtime, 6, 2) as month from listing order by 1, 2, 3 limit 10; listid | listtime | month --------+---------------------+------- 1 | 2008-01-24 06:43:29 | 01 2 | 2008-03-05 12:25:29 | 03 3 | 2008-11-01 07:35:33 | 11 4 | 2008-05-24 01:18:37 | 05 5 | 2008-05-17 02:29:11 | 05 6 | 2008-08-15 02:08:13 | 08 7 | 2008-11-15 09:38:15 | 11 8 | 2008-11-09 05:07:30 | 11 9 | 2008-09-09 08:03:36 | 09 10 | 2008-06-17 09:44:54 | 06 (10 rows)

下列範例同上,但使用 FROM...FOR 選項:

select listid, listtime, substring(listtime from 6 for 2) as month from listing order by 1, 2, 3 limit 10; listid | listtime | month --------+---------------------+------- 1 | 2008-01-24 06:43:29 | 01 2 | 2008-03-05 12:25:29 | 03 3 | 2008-11-01 07:35:33 | 11 4 | 2008-05-24 01:18:37 | 05 5 | 2008-05-17 02:29:11 | 05 6 | 2008-08-15 02:08:13 | 08 7 | 2008-11-15 09:38:15 | 11 8 | 2008-11-09 05:07:30 | 11 9 | 2008-09-09 08:03:36 | 09 10 | 2008-06-17 09:44:54 | 06 (10 rows)

如果字串可能包含雙位元組字元,則您無法使用 SUBSTRING 來肯定地抽取字串的字首,因為您需要根據位元組數來指定雙位元組字串的長度,而不是字元數。若要根據位元組長度來擷取字串的開頭部分,您可以將字串 CAST 成為 VARCHAR(byte_length) 以截斷字串,其中 byte_length 是所需的長度。下列範例從 'Fourscore and seven' 字串中擷取前 5 個位元組。

select cast('Fourscore and seven' as varchar(5)); varchar ------- Fours

下列範例示範二元值的負起始位置abc。由於起始位置是 -3,所以從二進制值的開頭提取子字符串。結果將自動顯示為二進制子字符串的十六進制表示形式。

select substring('abc'::varbyte, -3); substring ----------- 616263

下列範例示範二元值的起始位置 1abc。因為未指定長度,所以字串從開頭位置提取到字串末尾。結果將自動顯示為二進制子字符串的十六進制表示形式。

select substring('abc'::varbyte, 1); substring ----------- 616263

下列範例示範二元值的起始位置 3abc。因為未指定長度,所以字串從開頭位置提取到字串末尾。結果將自動顯示為二進制子字符串的十六進制表示形式。

select substring('abc'::varbyte, 3); substring ----------- 63

下列範例示範二元值的起始位置 2abc。字符串從開始位置提取到位置 10,但字符串的結尾位於位置 3。結果將自動顯示為二進制子字符串的十六進制表示形式。

select substring('abc'::varbyte, 2, 10); substring ----------- 6263

下列範例示範二元值的起始位置 2abc。字符串從起始位置提取 1 個字節。結果將自動顯示為二進制子字符串的十六進制表示形式。

select substring('abc'::varbyte, 2, 1); substring ----------- 62