

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# SUBSTRING 関数
<a name="SUBSTRING"></a>

文字列内で、指定された開始位置からの文字列のサブセットを返します。

入力が文字列の場合、抽出される文字の開始位置および文字数はバイト数ではなく文字数に基づきます。つまり、マルチバイト文字は 1 文字としてカウントされます。入力がバイナリ式の場合、開始位置と抽出される部分文字列はバイト数に基づきます。負の長さを指定することはできませんが、開始位置を負に指定することは可能です。

## 構文
<a name="SUBSTRING-synopsis"></a>

```
SUBSTRING(charactestring FROM start_position [ FOR numbecharacters ] )
```

```
SUBSTRING(charactestring, start_position, numbecharacters )
```

```
SUBSTRING(binary_expression, start_byte, numbebytes )
```

```
SUBSTRING(binary_expression, start_byte )
```

## 引数
<a name="SUBSTRING-arguments"></a>

 *charactestring*   
検索する文字列。文字データ型以外のデータ型は、文字列のように扱われます。

 *start\$1position*   
文字列内で抽出を開始する位置 (1 から始まる)。*start\$1position* はバイト数ではなく文字数に基づくため、マルチバイト文字は 1 文字としてカウントされます。負の数を指定することもできます。

 *numbecharacters*   
抽出する文字の数 (サブ文字列の長さ)。*数値文字*はバイト数ではなく文字数に基づいているため、マルチバイト文字は 1 文字としてカウントされます。負の数を指定することはできません。

 *start\$1byte*   
バイナリ表現内の抽出を開始する (先頭を 1 とする) 位置。負の数を指定することもできます。

 *numbebytes*   
抽出するバイト数 (サブ文字列の長さ)。負の数を指定することはできません。

## 戻り型
<a name="SUBSTRING-return-type"></a>

VARCHAR

## 文字列の使用に関する注意事項
<a name="SUBSTRING_usage_notes"></a>

次の例では、6 番目の文字で始まる 4 文字の文字列を返します。

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

*start\$1position* \$1 *numbecharacters* が*文字列*の長さを超える場合、SUBSTRING は *start\$1position* から文字列の末尾まで部分文字列を返します。例: 

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

`start_position` が負の数または 0 である場合、SUBSTRING 関数は、文字列の先頭文字から `start_position` \$1 `numbecharacters` -1 文字までをサブ文字列として返します。次に例を示します。

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

`start_position` \$1 `numbecharacters` -1 が 0 以下である場合、SUBSTRING は空の文字列を返します。次に例を示します。

```
select substring('caterpillar',-5,4);
substring
-----------

(1 row)
```

## 例
<a name="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 を使用して文字列の先頭部分を期待どおりに抽出することはできません。これは、マルチバイト文字列の長さを、文字数ではなくバイト数に基づいて指定する必要があるためです。バイト数での長さに基づいて文字列の最初のセグメントを取得するためには、文字列を VARCHAR(*byte\$1length*) として CAST することで文字列を切り捨てます。このとき、*byte\$1length* は必要な長さとなります。次の例では、文字列 `'Fourscore and seven'` から最初の 5 バイトを抽出します。

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

varchar
-------
Fours
```

次の例では、入力文字列 `Ana` の最後のスペースの後に表示される最初の名前 `Silva, Ana` を返します。

```
select reverse(substring(reverse('Silva, Ana'), 1, position(' ' IN reverse('Silva, Ana'))))

 reverse
-----------
 Ana
```