メインコンテンツまでスキップ
バージョン: 26.x

SUBSTRING_INDEX

説明

SUBSTRING_INDEX関数は、指定された区切り文字に基づいて文字列の一部を抽出するために使用されます。区切り文字の出現回数を指定することで、左側または右側から抽出を実行できます。

構文

SUBSTRING_INDEX(<content>, <delimiter>, <field>)

パラメータ

Parameterデスクリプション
<content>抽出元のソース文字列。型: VARCHAR
<delimiter>区切り文字列。大文字小文字を区別し、マルチバイト文字をサポートします。型: VARCHAR
<field>区切り文字の出現回数。正の値は左から、負の値は右から数え、0は空文字列を返します。型: INT

戻り値

VARCHAR型を返し、抽出された部分文字列を表します。

抽出ルール:

  • field > 0の場合: 左からfield番目の区切り文字より前の内容を返します
  • field < 0の場合: 右から|field|番目の区切り文字より後の内容を返します
  • field = 0の場合: 空文字列を返します(contentがNULLの場合はNULLを返します)
  • 大文字小文字を区別した完全一致の区切り文字マッチング

特殊なケース:

  • いずれかのパラメータがNULLの場合、NULLを返します
  • 区切り文字が文字列に存在しない場合、元の文字列を返します
  • 指定された回数が実際の区切り文字の出現回数を超える場合、抽出可能な最大部分を返します
  • 区切り文字が空文字列の場合、空文字列を返します
  • ソース文字列が空の場合、空文字列を返します

Examples

  1. 基本的な左からの抽出
SELECT SUBSTRING_INDEX('hello world', ' ', 1), SUBSTRING_INDEX('one,two,three', ',', 2);
+----------------------------------------+------------------------------------------+
| SUBSTRING_INDEX('hello world', ' ', 1) | SUBSTRING_INDEX('one,two,three', ',', 2) |
+----------------------------------------+------------------------------------------+
| hello | one,two |
+----------------------------------------+------------------------------------------+
  1. 右抽出(負の数)
SELECT SUBSTRING_INDEX('hello world', ' ', -1), SUBSTRING_INDEX('one,two,three', ',', -1);
+-----------------------------------------+-------------------------------------------+
| SUBSTRING_INDEX('hello world', ' ', -1) | SUBSTRING_INDEX('one,two,three', ',', -1) |
+-----------------------------------------+-------------------------------------------+
| world | three |
+-----------------------------------------+-------------------------------------------+
  1. NULL値の処理
SELECT SUBSTRING_INDEX(NULL, ',', 1), SUBSTRING_INDEX('test', NULL, 1);
+--------------------------------+------------------------------------+
| SUBSTRING_INDEX(NULL, ',', 1) | SUBSTRING_INDEX('test', NULL, 1) |
+--------------------------------+------------------------------------+
| NULL | NULL |
+--------------------------------+------------------------------------+
  1. ゼロ件数の処理
SELECT SUBSTRING_INDEX('hello world', ' ', 0), SUBSTRING_INDEX('a,b,c', ',', 0);
+----------------------------------------+----------------------------------+
| SUBSTRING_INDEX('hello world', ' ', 0) | SUBSTRING_INDEX('a,b,c', ',', 0) |
+----------------------------------------+----------------------------------+
| | |
+----------------------------------------+----------------------------------+
  1. デリミターが存在しません
SELECT SUBSTRING_INDEX('hello world', ',', 1), SUBSTRING_INDEX('no-delimiter', '|', -1);
+----------------------------------------+------------------------------------------+
| SUBSTRING_INDEX('hello world', ',', 1) | SUBSTRING_INDEX('no-delimiter', '|', -1) |
+----------------------------------------+------------------------------------------+
| hello world | no-delimiter |
+----------------------------------------+------------------------------------------+
  1. カウントが区切り文字の出現回数を超えています
SELECT SUBSTRING_INDEX('a,b,c', ',', 5), SUBSTRING_INDEX('a,b,c', ',', -5);
+----------------------------------+-----------------------------------+
| SUBSTRING_INDEX('a,b,c', ',', 5) | SUBSTRING_INDEX('a,b,c', ',', -5) |
+----------------------------------+-----------------------------------+
| a,b,c | a,b,c |
+----------------------------------+-----------------------------------+
  1. UTF-8マルチバイト文字デリミタ
SELECT SUBSTRING_INDEX('ṭṛì→ḍḍumai→hello', '→', 1), SUBSTRING_INDEX('ṭṛì→ḍḍumai→hello', '→', -1);
+-----------------------------------------------+------------------------------------------------+
| SUBSTRING_INDEX('ṭṛì→ḍḍumai→hello', '→', 1) | SUBSTRING_INDEX('ṭṛì→ḍḍumai→hello', '→', -1) |
+-----------------------------------------------+------------------------------------------------+
| ṭṛì | hello |
+-----------------------------------------------+------------------------------------------------+
  1. 複数文字の区切り文字
SELECT SUBSTRING_INDEX('data::field::value', '::', 2), SUBSTRING_INDEX('data::field::value', '::', -1);
+---------------------------------------------+----------------------------------------------+
| SUBSTRING_INDEX('data::field::value', '::', 2) | SUBSTRING_INDEX('data::field::value', '::', -1) |
+---------------------------------------------+----------------------------------------------+
| data::field | value |
+---------------------------------------------+----------------------------------------------+
  1. 空のソース文字列
SELECT SUBSTRING_INDEX('', ' ', 1);
+-----------------------------+
| SUBSTRING_INDEX('', ' ', 1) |
+-----------------------------+
| |
+-----------------------------+

キーワード

SUBSTRING_INDEX, SUBSTRING