1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
|
DELIMITER $$
DROP FUNCTION IF EXISTS `pontaury`.`splitAndTranslate`$$
CREATE DEFINER=`root`@`localhost` FUNCTION `splitAndTranslate`(str TEXT, delim VARCHAR(124)) RETURNS text CHARSET latin1
DETERMINISTIC
BEGIN
DECLARE i INT DEFAULT 0; -- total number of delimiters
DECLARE ctr INT DEFAULT 0; -- counter for the loop
DECLARE str_len INT; -- string length,self explanatory
DECLARE out_str text DEFAULT ''; -- return string holder
DECLARE temp_str text DEFAULT ''; -- temporary string holder
DECLARE temp_val VARCHAR(255) DEFAULT ''; -- temporary string holder for query
DROP TEMPORARY TABLE IF EXISTS tmpValeurs;
CREATE TEMPORARY TABLE tmpValeurs
(
id_valeur int(10) NOT NULL AUTO_INCREMENT,
valeur varchar(255) NOT NULL DEFAULT '',
PRIMARY KEY (id_valeur)
);
-- INSERT INTO tmpValeurs (valeur) VALUES ('toto');
-- INSERT INTO tmpValeurs (valeur) VALUES ('toto');
-- get length
SET str_len=LENGTH(str);
SET i = (LENGTH(str)-LENGTH(REPLACE(str, delim, '')))/LENGTH(delim) + 1;
-- get total number delimeters and add 1
-- add 1 since total separated values are 1 more than the number of delimiters
-- start of while loop
WHILE(ctr<i) DO
-- add 1 to the counter, which will also be used to get the value of the string
SET ctr=ctr+1;
-- get value separated by delimiter using ctr as the index
SET temp_str = REPLACE(SUBSTRING(SUBSTRING_INDEX(str, delim, ctr), LENGTH(SUBSTRING_INDEX(str, delim,ctr - 1)) + 1), delim, '');
-- query real value and insert into temporary value holder, temp_str contains the exploded ID
SELECT valeur INTO temp_val FROM tmpValeurs WHERE id_valeur=temp_str;
-- concat real value into output string separated by delimiter
SET out_str=CONCAT(out_str, temp_val, ',');
END WHILE;
-- end of while loop
-- trim delimiter from end of string
SET out_str=TRIM(TRAILING delim FROM out_str);
RETURN(out_str); -- return
END$$
DELIMITER ; |
Partager