データベースで文字列を操作する機会は意外と多くあります。たとえば、社員コードの一部を取り出したり、メールアドレスからユーザー名だけを抽出したり、ログデータから特定の情報を切り出したりといった場面です。
Oracleデータベースでは、こうした文字列の一部を抽出する際に便利な関数として SUBSTR
(サブストリング)関数が用意されています。
本記事では、SUBSTR
関数の基本的な使い方から、INSTR
関数との組み合わせによる応用的な活用方法まで、実例を交えてわかりやすく解説していきます。
「データの一部分だけ取り出したい」というニーズに対し、柔軟に対応できるようになることを目指しましょう。
基本構文の解説
OracleのSUBSTR
関数は、文字列の中から指定した位置・長さの部分文字列を抽出するための関数です。構文は以下のようになります。
SUBSTR(文字列, 開始位置 [, 文字数])
それぞれの引数の意味は次の通りです。
引数 | 説明 |
---|---|
文字列 | 抽出元となる文字列です。テーブルのカラムや文字列リテラルが使えます。 |
開始位置 | 抽出を始める位置を1から数えた番号で指定します。 |
文字数(省略可) | 抽出する文字数。省略した場合は、開始位置から文字列の末尾までが対象になります。 |
SELECT SUBSTR('ABCDEFG', 2, 3) FROM DUAL;
-- 結果:'BCD'
この例では、「ABCDEFG」という文字列の2文字目から3文字分を取り出しており、結果は「BCD」になります。
開始位置に負の値を指定する場合
SUBSTR
では、開始位置に負の値を指定することも可能です。この場合、文字列の末尾から数えた位置になります。
SELECT SUBSTR('ABCDEFG', -3, 2) FROM DUAL;
-- 結果:'EF'
この例では、末尾から3文字目(’E’)を起点に2文字分(’E’と’F’)を抽出しています。
文字数を省略した場合
文字数を省略すると、開始位置から文字列の末尾までが対象になります。
SELECT SUBSTR('ABCDEFG', 5) FROM DUAL;
-- 結果:'EFG'
このように、SUBSTR
は非常にシンプルな構文で柔軟な文字列処理が可能です。次の章では、具体的な使用例をいくつか取り上げて、さらに理解を深めていきましょう。
基本的な使用例
ここでは、SUBSTR
関数を使った基本的な文字列抽出の例をいくつか紹介します。実際のSQL文とその結果を見ながら、どのように動作するのかを確認していきましょう。
例1:特定の位置から指定した文字数を取り出す
SELECT SUBSTR('ABCDEFG', 2, 3) AS result FROM DUAL;
-- 結果:'BCD'
このSQLでは、文字列「ABCDEFG」の2文字目(’B’)から3文字分を抽出しています。結果は「BCD」となります。
例2:末尾から数えて文字を取り出す
SELECT SUBSTR('ABCDEFG', -3, 2) AS result FROM DUAL;
-- 結果:'EF'
開始位置に負の値(-3)を指定すると、末尾から数えて3文字目(’E’)が起点になります。そこから2文字分(’E’と’F’)を取り出して「EF」となります。
例3:文字数を省略して末尾まで抽出する
SELECT SUBSTR('ABCDEFG', 5) AS result FROM DUAL;
-- 結果:'EFG'
このように、文字数の引数を省略した場合、開始位置(5文字目=’E’)から末尾までをすべて抽出します。
開始位置が文字列の長さを超えている場合
SELECT SUBSTR('ABCDEFG', 10, 3) AS result FROM DUAL;
-- 結果:''(空文字列)
開始位置が文字列の長さ(7文字)を超えている場合、結果は空文字列になります。エラーにはなりません。
応用例
ここからは、SUBSTR
関数を実務でどのように活用できるかを、具体的な例を通して見ていきましょう。固定長のコードや、区切り文字を含む文字列からの抽出など、実際の業務でもよくあるケースを紹介します。
固定長データの一部を抽出する
社員番号や伝票番号など、固定のフォーマットで構成された文字列から、必要な部分だけを取り出すケースです。
-- 社員コード「ABC202501」から「年度部分(2025)」を抽出
SELECT SUBSTR('ABC202501', 4, 4) AS extracted_year FROM DUAL;
-- 結果:'2025'
この例では、社員コードの4文字目から4文字分を取り出すことで、年度情報(2025)を抽出しています。
電話番号から市外局番を抽出する(INSTRとの併用)
区切り文字(たとえばハイフン)を含む文字列の場合、その位置を動的に取得するにはINSTR
関数との組み合わせが有効です。
-- 電話番号から市外局番(最初の「-」の前)を抽出
SELECT SUBSTR('03-1234-5678', 1, INSTR('03-1234-5678', '-') - 1) AS area_code FROM DUAL;
-- 結果:'03'
このように、INSTR
で「-」の位置を取得し、SUBSTR
でその手前の文字列を取り出します。
まとめ
本記事では、OracleのSUBSTR
関数を使って文字列の一部を抽出する方法について、基礎から応用まで解説しました。
文字列の一部を取り出す処理は、データの整形や条件分岐など、多くの場面で登場します。SUBSTR
関数の使い方をしっかりと理解しておくことで、より柔軟で効率的なSQLを書くことができるようになるでしょう。
コメント