本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
根據指定的開始位置傳回字串的子集。
如果輸入是字串,則提取的開始位置和字元數是以字元數為基礎,而不是位元組,所以多位元組字元視為單一字元。如果輸入是二進位運算式,則開始位置和提取的子字串是以位元組為基礎。您不能指定負長度,但可以指定負的開始位置。
語法
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 )
引數
- character_string
-
供進行搜尋的字串。非字元資料類型視為字串。
- start_position
-
在字串內要開始擷取的位置,從 1 開始。start_position 以字元數為基礎,而不是位元組,所以多位元組字元視為單一字元。這可以是負數。
- number_characters
-
要擷取的字元數 (子字串的長度)。number_characters 以字元數為基礎,而不是位元組,所以多位元組字元視為單一字元。這不能是負數。
- binary_expression
-
要搜尋之資料類型 VARBYTE 的 binary_expression。
- start_byte
-
在二進位運算式內要開始擷取的位置,從 1 開始。這可以是負數。
- number_bytes
-
要擷取的位元組數,即子字串的長度。此數字不可以是負數。
傳回類型
VARCHAR 或 VARBYTE 取決於輸入。
使用須知
以下是如何使用 start_position 和 number_characters 從字串中的各個位置提取子字串的一些範例。
下列範例傳回從第六個字元開始的四個字元的字串。
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
下列範例顯示 1 作為二進位值 abc
的開始位置。因為沒有指定長度,所以字串從開始位置提取到字串的結尾。結果自動顯示為二進位子字串的十六進位表示形式。
select substring('abc'::varbyte, 1);
substring
-----------
616263
下列範例顯示 3 作為二進位值 abc
的開始位置。因為沒有指定長度,所以字串是從開始位置提取到字串的結尾。結果自動顯示為二進位子字串的十六進位表示形式。
select substring('abc'::varbyte, 3);
substring
-----------
63
下列範例顯示 2 作為二進位值 abc
的開始位置。字串從開始位置提取到位置 10,但字串的結尾位於位置 3。結果自動顯示為二進位子字串的十六進位表示形式。
select substring('abc'::varbyte, 2, 10);
substring
-----------
6263
下列範例顯示 2 作為二進位值 abc
的開始位置。字串從開始位置提取 1 個位元組。結果自動顯示為二進位子字串的十六進位表示形式。
select substring('abc'::varbyte, 2, 1);
substring
-----------
62
下列範例會傳回輸入字串 Silva, Ana
中最後一個空格之後出現的名字 Ana
。
select reverse(substring(reverse('Silva, Ana'), 1, position(' ' IN reverse('Silva, Ana'))))
reverse ----------- Ana