2009-07-03 2 views
2

私は、トークンで区切られた文字列をパラメータとして受け取り、その文字列内のすべての項目のプロシージャでwhileループを実行するストアドプロシージャを記述しようとしています。mySqlにsplit()メソッドに類似したものがありますか?

このタスクを実行するmysqlドキュメントには何も表示されません...これを行う方法はありますか?

答えて

3

残念ながら、mysqlは配列やテーブル(私が知っている)を返さないようにしています。これはあなたの文字列をトークン化し、「トークン」と呼ばれるテーブルに値を挿入し、行ごとに1つのトークンます

DELIMITER $$ 

create function splitter_count (str varchar(200), delim char(1)) returns int 
    return (length(replace(str, delim, concat(delim, ' '))) - length(str)) $$ 

CREATE PROCEDURE tokenize (str varchar(200), delim char(1)) 
BEGIN 
    DECLARE i INT DEFAULT 0; 
    create table tokens(val varchar(50)); 
    WHILE i <= splitter_count(str, delim) DO 
    insert into tokens(val) select(substring_index(SUBSTRING_INDEX(str, delim, i+1), delim, -1)); 
    SET i = i + 1; 
    END WHILE; 

END $$ 

DELIMITER ; 

:ここ

はサンプルストアドプロシージャです。あなたはかなり簡単に役立つ何かをするためにそれを変更することができるはずです。また、入力の長さを200から増やすこともできます。

1

あなた自身の機能をロールする必要があると思います。 SUBSTRING_INDEXは便利になるだろう:

SUBSTRING_INDEX(str,delim,count)

は、区切り文字delimのカウント出現する前に文字列strからのサブストリングを返します。 countが正の場合は、最後の区切り文字の左側にあるすべてのものが返されます。 countが負の場合は、最後の区切り文字の右側にあるものすべてが返されます。 SUBSTRING_INDEX()は、delimを検索するときに大文字と小文字を区別した一致を実行します。

mysql> SELECT SUBSTRING_INDEX('www.mysql.com', '.', 2); 
     -> 'www.mysql' 
mysql> SELECT SUBSTRING_INDEX('www.mysql.com', '.', -2); 
     -> 'mysql.com' 

この関数はマルチバイトセーフです。

1

私はあなたがそれはちょうど、分割()関数のように簡単ではないのですが、私はあなたがこの機能でwhileループをうまくことができると確信していsubstring_index

を経由して、あなたが欲しいものを達成することができると思います。