SQL道場 文字列関数 SUBSTRING関数

SQLで文字列の部分切り出しするSUBSTRING関数について記載しています。

対応データベースSQL Server MySQL PostgreSQL ANSI

SUBSTRING関数の文法

SELECT SUBSTRING(対象文字列,開始位置,文字数) FROM テーブル
SELECT SUBSTRING(対象文字列 FROM 開始位置 FOR 文字数) FROM テーブル
【MySQL書式】
SELECT SUBSTRING(対象文字列,開始位置)
SELECT SUBSTRING(対象文字列 FROM 開始位置)
SELECT SUBSTRING(対象文字列,開始位置,文字数)
SELECT SUBSTRING(対象文字列 FROM 開始位置 FOR 文字数)
引数対象文字列文字列型
開始位置整数型
文字数整数型
返値文字列型 編集後の文字列が戻ります。

SQL Server

引数対象文字列character、binary、text、ntext、または image式です。
開始位置返された文字の開始位置を示す integer 式または bigint 式です。
(番号は 1 から開始し、これは式の最初の文字が 1 であることを意味します)。
「開始位置」に 1 より小さい値を指定した場合は、「対象文字列」に指定された文字の先頭から値が返されます。
この場合、返される文字数は、「開始位置」 + 「文字数」-1 の合計値か、0 のどちらか大きい方になります。
「開始位置」 が値式の文字数を上回る場合は、長さがゼロの式が返されます。
文字数「対象文字列」で返す文字数を正の整数または bigint 式で指定します。
「文字数」が負の場合はエラーが生成され、ステートメントは終了します。
「開始位置」 と「文字数」の合計が「対象文字列」の文字数を上回る場合は、「開始位置」 の先頭から値式全体が返されます。
返値「対象文字列」が、サポートされている文字データ型の 1 つである場合は、文字データが返されます。
「対象文字列」が、サポートされている binary データ型の 1 つである場合は、binary データが返されます。
返される文字列のデータ型は、指定した式のデータ型と同じです。ただし、下記の表の場合は例外です。

例外

指定した式戻り値の型
char/varchar/textvarchar
nchar/nvarchar/ntextnvarchar
binary/varbinary/imagevarbinary

SUBSTRING関数は指定された文字列の開始位置から文字数分を切り出し編集後の文字列を戻します。漢字は1文字単位で数えられます。PostgreSQLではマルチバイトに対応していない場合はバイト単位で切り出されます。

MySQLでは、SUBSTRING関数はマルチバイトセーフです。また、「開始位置」に負の値を使用することもできます。 その場合、部分文字列の先頭は文字列の先頭でなく、文字列の末尾からの 「開始位置」文字になります。 この関数のどの形式でも、「開始位置」で負の値を使用できます。 「開始位置」の値が 0 の場合、空の文字列が返されます。

補助文字 (サロゲート ペア)

SQL Serverマイクロソフト公式

補助文字 (SC) の照合順序を使用する場合、「開始位置」 と 「文字数」 では、「対象文字列」 の各サロゲート ペアが 1 文字としてカウントされます。

バイト数で切り取る関数はSQLServerにはありません。

実行例

MySQLの実行例

/* MySQL 文字列の開始位置から文字数分を切り出すサンプル */
SELECT STR,SUBSTRING(STR,2,1) FROM testdb.WORK;
SUBSTRING関数サンプル実行結果

FROM構文を使用した場合

/* MySQL FROMを使用した構文サンプル */
SELECT SUBSTRING('travel planning' FROM 4);
SUBSTRING関数サンプル実行結果

FROM FOR構文を使用した場合

/* MySQL FROM FORを使用した構文サンプル */
SELECT SUBSTRING('travel planning' FROM 4 FOR 2);
SUBSTRING関数サンプル実行結果

特定の文字以降の文字列を切り出す方法

例えば、Eメールアドレスの「@」の右側を切り出すような文字列の中にある特定文字を目印に、その右側や左側の文字を切り出すなどできます。そのためには、特定の文字の位置を調べるMySQLの関数であるinstr()やlocate()を併用します。

/* MySQL 特定の文字以降の文字列を切り出すサンプル */
select 'sunarin@gmail.com', substring('sunarin@gmail.com',instr('sunarin@gmail.com', '@')+1)
SUBSTRING関数サンプル実行結果

括弧内の文字列を切り出す

instr()関数を組み合わせれば、ある文字列の括弧内の文字列を切り出すこともできます。

/* MySQL 括弧内の文字列を切り出すサンプル */
select 'りんご(青森県産)',substring('りんご(青森県産)',instr('りんご(青森県産)', '(')+1,instr('りんご(青森県産)', ')') - instr('りんご(青森県産)', '(') -1) 
SUBSTRING関数サンプル実行結果

SQLServerの実行例

/* SQL Server  文字列の開始位置から文字数分を切り出すサンプル */
SELECT STR,SUBSTRING(STR,2,1) FROM [testdb].[dbo].[WORK];
SUBSTRING関数サンプル実行結果

バイト数で指定する方法

バイト数で指定する場合は、CONVERT関数などの型変換を利用します。

/* SQL Server バイト数で指定するサンプル */
SELECT CONVERT(CHAR(2), 'TEST TEST');
SUBSTRING関数サンプル実行結果

UPDATE文で使用する方法

/* SQL Server  UPDATE文で使用するサンプル */
UPDATE [testdb].[dbo].[WORK] SET STR= SUBSTRING(STR, 1, 3);