

 Amazon Redshift 將不再支援從修補程式 198 開始建立新的 Python UDFs。現有 Python UDF 將繼續正常運作至 2026 年 6 月 30 日。如需詳細資訊，請參閱[部落格文章](https://aws.amazon.com/blogs/big-data/amazon-redshift-python-user-defined-functions-will-reach-end-of-support-after-june-30-2026/)。

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

# SUBSTRING 函數
<a name="r_SUBSTRING"></a>

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

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

## 語法
<a name="r_SUBSTRING-synopsis"></a>

```
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 )
```

## 引數
<a name="r_SUBSTRING-arguments"></a>

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

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

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

 *binary\_expression*   
要搜尋之資料類型 VARBYTE 的 binary\_expression。

 *start\_byte*   
在二進位運算式內要開始擷取的位置，從 1 開始。這可以是負數。

 *number\_bytes*   
要擷取的位元組數，即子字串的長度。此數字不可以是負數。

## 傳回類型
<a name="r_SUBSTRING-return-type"></a>

VARCHAR 或 VARBYTE 取決於輸入。

## 使用須知
<a name="r_SUBSTRING_usage_notes"></a>

以下是如何使用 *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)
```

## 範例
<a name="r_SUBSTRING-examples"></a>

下列範例從 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
```