メニュー
Amazon Redshift
データベース開発者ガイド (API Version 2012-12-01)

SUBSTRING 関数

指定された文字位置にある指定された文字数の文字を、文字列から抽出して返します。

文字の位置および文字数はバイト数ではなく文字数に基づくため、マルチバイト文字は 1 文字としてカウントされます。負の長さを指定することはできませんが、負の開始位置は指定できます。

構文

Copy
SUBSTRING(string FROM start_position [ FOR number_characters ] )

Copy
SUBSTRING(string, start_position, number_characters )

引数

string

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

start_position

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

number_characters

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

戻り型

VARCHAR

使用に関する注意事項

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

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

start_position + number_charactersstring の長さを超える場合、SUBSTRING は、start_position から文字列末尾までをサブ文字列として返します。以下に例を示します。

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

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

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

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

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

次の例は、LISTING テーブル内の LISTTIME 文字列から月を返します。

Copy
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 オプションを使用します。

Copy
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_length) として CAST することで文字列を切り捨てます。このとき、byte_length は必要な長さとなります。次の例では、文字列 'Fourscore and seven' から最初の 5 バイトを抽出します。

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