SUBSTRING 関数
文字列内で、指定された開始位置からの文字列のサブセットを返します。
入力が文字列の場合、抽出される文字の開始位置および文字数はバイト数ではなく文字数に基づきます。つまり、マルチバイト文字は 1 文字としてカウントされます。入力がバイナリ式の場合、開始位置と抽出される部分文字列はバイト数に基づきます。負の長さを指定することはできませんが、開始位置を負に指定することは可能です。
構文
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 はバイト数ではなく文字数に基づくため、マルチバイト文字は 1 文字としてカウントされます。負の数を指定することもできます。
- number_characters
-
抽出する文字の数 (サブ文字列の長さ)。number_characters はバイト数ではなく文字数に基づくため、マルチバイト文字は 1 文字としてカウントされます。負の数を指定することはできません。
- binary_expression
-
検索する VARBYTE データ型の binary_expression。
- start_byte
-
バイナリ表現内の抽出を開始する (先頭を 1 とする) 位置。負の数を指定することもできます。
- number_bytes
-
抽出するバイト数 (サブ文字列の長さ)。負の数を指定することはできません。
戻り型
入力に応じて、VARCHAR 型または VARBYTE 型を取ります。
使用に関する注意事項
以下は、start_position と number_characters を使用して文字列のさまざまな位置から部分文字列を抽出する方法の例です。
次の例では、6 番目の文字で始まる 4 文字の文字列を返します。
select substring('caterpillar',6,4);
substring
-----------
pill
(1 row)
start_position + number_characters が文字列の長さを超える場合、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 が 0 以下である場合、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 を使用して文字列の先頭部分を期待どおりに抽出することはできません。これは、マルチバイト文字列の長さを、文字数ではなくバイト数に基づいて指定する必要があるためです。バイト数での長さに基づいて文字列の最初のセグメントを取得するためには、文字列を VARCHAR(byte_length) として CAST することで文字列を切り捨てます。このとき、byte_length は必要な長さとなります。次の例では、文字列 'Fourscore and
seven'
から最初の 5 バイトを抽出します。
select cast('Fourscore and seven' as varchar(5));
varchar
-------
Fours
次に、バイナリ値 abc
の開始位置が負の場合の例を示します。開始位置が -3 であるため、サブ文字列はバイナリ値の先頭から抽出されます。結果は、バイナリ部分文字列の 16 進数表現として自動的に表示されます。
select substring('abc'::varbyte, -3);
substring
-----------
616263
次に、バイナリ値 abc
の開始位置が 1 の場合の例を示します。長さが指定されていないため、文字列の抽出は文字列の開始位置から末尾までを対象に行われます。結果は、バイナリ部分文字列の 16 進数表現として自動的に表示されます。
select substring('abc'::varbyte, 1);
substring
-----------
616263
次に、バイナリ値 abc
の開始位置が 3 の場合の例を示します。長さが指定されていないため、文字列の抽出は文字列の開始位置から末尾までを対象に行われます。結果は、バイナリ部分文字列の 16 進数表現として自動的に表示されます。
select substring('abc'::varbyte, 3);
substring
-----------
63
次に、バイナリ値 abc
に対して開始位置が 2 の場合の例を示します。文字列は開始位置から位置 10 まで抽出されますが、文字列の末尾は位置 3 になります。結果は、バイナリ部分文字列の 16 進数表現として自動的に表示されます。
select substring('abc'::varbyte, 2, 10);
substring
-----------
6263
次に、バイナリ値 abc
に対して開始位置が 2 の場合の例を示します。文字列は開始位置から 1 バイト分抽出されます。結果は、バイナリ部分文字列の 16 進数表現として自動的に表示されます。
select substring('abc'::varbyte, 2, 1);
substring
-----------
62
次の例では、入力文字列 Ana
の最後のスペースの後に表示される最初の名前 Silva, Ana
を返します。
select reverse(substring(reverse('Silva, Ana'), 1, position(' ' IN reverse('Silva, Ana'))))
reverse ----------- Ana