2009-07-03 6 views
2

Je cherche à écrire une procédure stockée qui prend comme paramètre une chaîne qui est délimitée par un jeton, puis exécute une boucle while dans la procédure pour chaque élément de cette chaîne.Existe-t-il quelque chose d'analogue à une méthode split() dans mySql?

Je ne vois rien dans la documentation mysql qui permettrait d'accomplir cette tâche ... y a-t-il un moyen de le faire?

Répondre

3

Malheureusement, mysql ne permet pas aux fonctions de retourner des tableaux ou des tableaux (que je connais), donc vous devez le faire un peu de manière hackily.

Voici un exemple de proc stocké:

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 ; 

Cela tokenizer votre chaîne, et insérez les valeurs dans une table appelée « jetons », un jeton par ligne. Vous devriez être capable de le modifier pour faire quelque chose d'utile assez facilement. En outre, vous pouvez augmenter la longueur d'entrée de 200.

1

Je pense que vous aurez besoin de lancer votre propre fonction. SUBSTRING_INDEX sera utile:

SUBSTRING_INDEX(str,delim,count)

Renvoie la chaîne de caractères str avant les occurrences de comptage du delimiter delim. Si count est positif, tout ce qui se trouve à gauche du délimiteur final (en partant de la gauche) est renvoyé. Si count est négatif, tout à droite du délimiteur final (en comptant à partir de la droite) est renvoyé. SUBSTRING_INDEX() effectue une correspondance sensible à la casse lors de la recherche de delim.

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

Cette fonction est sûre à plusieurs octets.

1

Je pense que vous pouvez accomplir ce que vous voulez via substring_index

Ce n'est pas aussi simple que juste une fonction split() mais je suis sûr que vous pouvez travailler une boucle while avec cette fonction.

Questions connexes