【MySQL】SUBSTRING_INDEXでカンマ区切り文字列から指定位置の値を取得する方法
カンマ区切りの文字列から、指定した位置にある単一の値を取り出したい場合は、SUBSTRING_INDEX() 関数を使用します。この関数をネスト(入れ子)して呼び出すことで、任意の位置の要素を簡単に抽出できます。
1. サンプルテーブルの作成
まず、カンマ区切りの文字列を格納するテーブルを作成します。
mysql> create table DemoTable1615
-> (
-> ListOfSubject text
-> );
Query OK, 0 rows affected (0.81 sec)2. レコードの挿入
INSERT文を使って、カンマ区切りの科目リストを登録します。
mysql> insert into DemoTable1615 values('Python,Java,MySQL,MongoDB,C,C++,ASP.net');
Query OK, 1 row affected (0.19 sec)3. 登録データの確認
SELECT文でテーブル内のすべてのレコードを表示してみましょう。
mysql> select * from DemoTable1615;
実行すると、次のような結果が表示されます。
+-----------------------------------------+ | ListOfSubject | +-----------------------------------------+ | Python,Java,MySQL,MongoDB,C,C++,ASP.net | +-----------------------------------------+ 1 row in set (0.00 sec)
4. 指定位置の値を取得するクエリ
ここでは例として、4番目の位置にある「MongoDB」を取得します。SUBSTRING_INDEX() を二重に使用するのがポイントです。
mysql> select substring_index(substring_index(ListOfSubject, ',', 4), ',', -1) as Position from DemoTable1615;
実行結果は以下の通りです。
+----------+ | Position | +----------+ | MongoDB | +----------+ 1 row in set (0.00 sec)
仕組みの解説
このクエリがどのように動作するのか、順を追って説明します。
- 内側の SUBSTRING_INDEX(ListOfSubject, ',', 4):区切り文字「,」が4回現れるまでの部分文字列、つまり先頭から4番目の要素まで(
Python,Java,MySQL,MongoDB)を返します。 - 外側の SUBSTRING_INDEX(..., ',', -1):その結果に対して、末尾から数えて最初の区切り文字より後ろの部分、つまり最後の要素(
MongoDB)だけを取り出します。
このように、正の数を指定すると左(先頭)から、負の数を指定すると右(末尾)から数える仕組みを利用することで、カンマ区切りの文字列から任意の位置の値を柔軟に取得できます。N番目の要素が欲しい場合は、内側の引数を N に変更するだけで対応可能です。
-
MySQLで特定の行から単一の値だけを取得する方法(SELECT INTOの使い方)
MySQLで特定の条件に一致する行から、単一の値だけを変数に取得したい場合は、SELECT ... INTO 変数構文とWHERE句を組み合わせて使用します。この記事では、実際のテーブル作成から値の取得までの手順を順番に解説します。 1. サンプルテーブルを作成する まずは動作確認用のテーブルを作成しましょう。学生ID・氏名・点数を持つシンプルなテーブルを定義します。 mysql> create table DemoTable1896 ( StudentId int NOT NULL AUTO_INCREMENT PRIMARY KEY, StudentName
-
MySQLでテーブルから特定の行を抽出するクエリの書き方
MySQLでは、WHERE句とORDER BY、LIMITを組み合わせることで、テーブルから条件に合致する特定の行だけを効率的に取得できます。本記事では、実際にサンプルテーブルを作成し、特定の行を抽出するクエリの実行手順をわかりやすく解説します。 1. サンプルテーブルの作成 まず、CREATE TABLE文を使ってサンプル用のテーブルを作成します。ここでは「Section(組)」と「StudentName(生徒名)」という2つのカラムを持つテーブルを用意しました。 mysql> create table DemoTable1972 ( Section char(1),