SQLで右から何文字を取得するRIGHT関数とSUBSTRING関数の使い方

SQLの文字列操作で重要なRIGHT関数とSUBSTRING関数について、基本的な使い方から実践的な活用方法まで解説します。これらの関数を使いこなせば、データ処理の幅が広がりますが、どのように使い分けるべきでしょうか?

SQLで右から文字列を取得する方法

文字列操作関数の基本
🔍
RIGHT関数

文字列の右端から指定した文字数を取得する基本関数

📝
SUBSTRING関数

文字列の任意の位置から指定した文字数を取得できる汎用関数

パフォーマンス

適切な関数選択でクエリの実行効率を最適化

RIGHT関数の基本的な使い方と構文

RIGHT関数は、文字列の右端から指定した文字数を取得する最も直感的な方法です。基本的な構文は以下の通りです:


RIGHT(文字列, 取得したい文字数)

 

具体的な使用例を見てみましょう:


-- メールアドレスのドメイン部分を取得
SELECT RIGHT('example@domain.com', 10)  -- domain.com
-- 商品コードの末尾3桁を取得
SELECT RIGHT('PROD-2024-001', 3)  -- 001

SUBSTRING関数を使った右端からの文字列取得

SUBSTRING関数を使って右端から文字列を取得する場合は、以下のような方法があります:


-- 基本構文
SUBSTRING(文字列, 開始位置, 文字数)
-- 右端から取得する場合
SUBSTRING(文字列, LEN(文字列) - 取得したい文字数 + 1, 取得したい文字数)

 

実践的な使用例:


-- 電話番号の下4桁を取得
SELECT SUBSTRING('03-1234-5678', LEN('03-1234-5678')-3, 4)  -- 5678
-- ファイル拡張子を取得
SELECT SUBSTRING('document.pdf', CHARINDEX('.', 'document.pdf'), 4)  -- .pdf

マルチバイト文字における文字列操作の注意点

日本語などのマルチバイト文字を扱う場合は、特別な注意が必要です:


-- 日本語文字列の右端3文字を取得
SELECT RIGHT('こんにちは世界', 3)  -- は世界
-- バイト単位での取得(SQLサーバーの場合)
SELECT CAST(RIGHT(CAST('こんにちは世界' AS VARBINARY), 6) AS NVARCHAR)

 

文字コードによって結果が異なる可能性があるため、以下の点に注意が必要です:

  • NVARCHAR型を使用して文字列を定義する
  • 文字数とバイト数を明確に区別する
  • 環境依存文字の使用を避ける

パフォーマンスを考慮した関数の使い分け

大量のデータを処理する場合、関数の選択はパフォーマンスに大きく影響します:

関数 使用ケース パフォーマンス特性
RIGHT 単純な右端切り出し 高速・低負荷
SUBSTRING 複雑な文字列操作 柔軟性が高い

 

以下のような場合は、RIGHT関数を優先的に使用することをお勧めします:

  • 単純に右端から固定長の文字列を取得する場合
  • インデックスが効く可能性がある場合
  • 大量データの処理時

実践的なSQLコーディング例と応用テクニック

実務でよく使用される具体的なコーディング例を紹介します:


-- 郵便番号の下4桁を取得
SELECT 
    postal_code,
    RIGHT(postal_code, 4) AS area_code
FROM addresses
-- ファイル名から拡張子を除いた部分を取得
SELECT 
    filename,
    LEFT(filename, LEN(filename) - LEN(RIGHT(filename, 
        CHARINDEX('.', REVERSE(filename))))) AS name_without_ext
FROM files
-- 電話番号を市外局番、市内局番、加入者番号に分割
SELECT 
    phone_number,
    LEFT(phone_number, CHARINDEX('-', phone_number) - 1) AS area_code,
    SUBSTRING(
        phone_number, 
        CHARINDEX('-', phone_number) + 1,
        CHARINDEX('-', phone_number, CHARINDEX('-', phone_number) + 1) 
        - CHARINDEX('-', phone_number) - 1
    ) AS local_code,
    RIGHT(phone_number, 
        LEN(phone_number) - CHARINDEX('-', REVERSE(phone_number)) 
    ) AS subscriber_number
FROM contacts

 

これらの関数を組み合わせることで、より複雑なデータ処理も可能になります:

  • データのクレンジング
  • 形式の標準化
  • データの分割と結合
  • パターンマッチング

 

参考リンク:
SQLServerの文字列関数の詳細な解説
Microsoft公式ドキュメント

 

マルチバイト文字の処理に関する詳細
PostgreSQL日本語マニュアル