MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

MySQLストアドプロシージャで文字列を分割し、各値をループ処理する方法

MySQLのストアドプロシージャ内で文字列を分割し、すべての値に対してループ処理を行いたい場合、REPLACE()関数を使用する必要はありません。SUBSTRING_INDEX()関数とLOOP文を組み合わせることで実現できます。手順としては、まずストアドプロシージャを作成し、次にデータを格納するテーブルを作成してから、値を渡してプロシージャを呼び出します。すると、分割された各値が順番にテーブルへ挿入されます。

ストアドプロシージャの作成

文字列を分割するストアドプロシージャを作成するクエリは以下の通りです。カンマ区切りの文字列を受け取り、先頭の要素を取り出してはテーブルに挿入し、処理済みの部分を削りながらループを回す仕組みになっています。

mysql> DELIMITER //
mysql> CREATE PROCEDURE SP_SplitString(Value longtext)
    -> BEGIN
    -> DECLARE front TEXT DEFAULT NULL;
    -> DECLARE frontlen INT DEFAULT NULL;
    -> DECLARE TempValue TEXT DEFAULT NULL;
    -> iterator:
    -> LOOP 
    -> IF LENGTH(TRIM(Value)) = 0 OR Value IS NULL THEN
    -> LEAVE iterator;
    -> END IF;
    -> SET front = SUBSTRING_INDEX(Value,',',1);
    -> SET frontlen = LENGTH(front);
    -> SET TempValue = TRIM(front);
    -> INSERT INTO store (allValues) VALUES (TempValue);
    -> SET Value = INSERT(Value,1,frontlen + 1,'');
    -> END LOOP;
    -> END //
Query OK, 0 rows affected (0.22 sec)
mysql> DELIMITER ;

このプロシージャのポイントは次の通りです。

  • SUBSTRING_INDEX(Value, ',', 1): カンマ区切りの文字列から最初の要素を取得します。
  • TRIM(): 要素の前後にある余分な空白を除去します。
  • INSERT(Value, 1, frontlen + 1, ''): 処理済みの要素と区切り文字を元の文字列から削除し、残りの部分だけを次のループに渡します。
  • LEAVE iterator: 文字列が空になった場合やNULLの場合にループを抜けます。

データ格納用テーブルの作成

次に、ストアドプロシージャで分割された値を保存するテーブルを作成します。テーブル作成のクエリは以下の通りです。

mysql> CREATE TABLE store(
   -> Id int NOT NULL AUTO_INCREMENT,
   -> allValues varchar(30),
   -> PRIMARY KEY(Id)
   -> );
Query OK, 0 rows affected (0.63 sec)

テーブルの初期状態を確認

テーブル内のすべてのレコードを表示して、初期状態を確認しておきましょう。

mysql> select *from store;
Empty set (0.00 sec)

この時点では、テーブルにはまだ何のレコードも存在していません。

ストアドプロシージャの呼び出し

CALLコマンドを使ってストアドプロシージャを呼び出します。引数としてカンマ区切りの文字列を渡します。

mysql> call SP_SplitString('Hi,Hello,Good Morning,Bye');
Query OK, 1 row affected (1.02 sec)

実行結果の確認

ストアドプロシージャを呼び出した後、改めてテーブルのレコードを表示してみましょう。

mysql> select *from store;

以下が出力結果です。

+----+--------------+
| Id | allValues    |
+----+--------------+
|  1 | Hi           |
|  2 | Hello        |
|  3 | Good Morning |
|  4 | Bye          |
+----+--------------+
4 rows in set (0.00 sec)

このように、「Hi」「Hello」「Good Morning」「Bye」の4つの値がカンマで正しく分割され、それぞれ個別のレコードとしてテーブルに挿入されていることが確認できます。「Good Morning」のようにスペースを含む要素も、TRIM()によって余分な空白だけが除去され、正しく保持されます。

  1. MySQLでカンマ区切りの文字列から特定の値を検索・選択する方法

    カンマ区切りで保存された文字列の中に、特定の値が含まれているかを確認して行を抽出したい場合があります。そのようなときは、MySQLの FIND_IN_SET() 関数を使用すると便利です。FIND_IN_SET() は、第1引数に検索したい文字列、第2引数にカンマ区切りの文字列を指定し、見つかった位置(1始まり)を返します。見つからない場合は0が返されるため、「0より大きい」という条件と組み合わせることで、該当するレコードだけを取得できます。テーブルの作成まず、サンプル用のテーブルを作成しましょう。mysql> create table demo81 -> ( ->

  2. 【C#】文字列を分割して結合する方法|Split・Joinメソッドの使い方を解説

    C#で文字列を分割・結合する基本C#で文字列を分割するにはSplit()メソッド、結合するにはstring.Join()メソッドを使用します。本記事では、具体的なサンプルコードを交えながら、文字列の分割から結合までの一連の流れをわかりやすく解説します。サンプルで使用する文字列まず、以下のような文字列を用意します。string str = This is our Demo String;Split()メソッドで文字列を分割するSplit()メソッドは、指定した区切り文字(ここでは半角スペース)を基準に、文字列を配列へ分割します。var arr = str.Split( );このコードを実行すると