-
-
Save saxenap/2cc62a9dcbbfa715bef801bc5698c9b0 to your computer and use it in GitHub Desktop.
MySQL Stored Procedure to Loop Delimited List
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
DELIMITER $$ | |
DROP PROCEDURE IF EXISTS LOOP_STUFF$$ | |
CREATE PROCEDURE LOOP_STUFF(IN STR_TXT VARCHAR(255)) | |
BEGIN | |
/* DECLARE VARIABLES FOR USE IN LOOP */ | |
DECLARE STR_LEN INT DEFAULT 0; | |
DECLARE SUB_LEN INT DEFAULT 0; | |
DECLARE SUB_TXT VARCHAR(255); | |
DECLARE COUNTER INT DEFAULT 0; | |
/* STORES FINAL RESULT */ | |
SET @RESULT = ''; | |
/* HANDLE NULL ARGUMENT ERROR */ | |
IF STR_TXT IS NULL THEN SET STR_TXT = ''; END IF; | |
DO_LOOP: | |
LOOP | |
/* GET LENGTH OF FULL REMAINING STRING TO GET ELEMENT POSITION */ | |
SET STR_LEN = CHAR_LENGTH(STR_TXT); | |
/* USE LENGTH OF THIS ELEMENT'S SUBSTRING FOR ELEMENT EXTRACTION */ | |
SET SUB_LEN = CHAR_LENGTH(SUBSTRING_INDEX(STR_TXT, ',', 1)) + 2; | |
/* EXTRACT LIST ELEMENT CORRESPONDING TO THIS ITERATION) */ | |
/* REPLACE COMMA WITH DELIMITER OF YOUR CHOICE IF NECESSARY */ | |
SET SUB_TXT = REPLACE(REPLACE(STR_TXT, MID(STR_TXT, SUB_LEN, STR_LEN), ''), ',', ''); | |
/* REMOVE ELEMENT FROM LIST */ | |
SET STR_TXT = MID(STR_TXT, SUB_LEN, STR_LEN); | |
/* DETERMINE WHETHER ELEMENT IS FIRST IN LIST */ | |
/* NOW YOU CAN USE CONDITIONAL LOGIC TO CONCAT TOGETHER A SQL STRING | |
TO @RESULT AND EXECUTE IT WITH PREPARE/EXECUTE/DEALLOCATE PREPARED STATEMENT */ | |
IF COUNTER = 0 THEN | |
/* DO STUFF WITH FIRST ITERATION OF LOOP HERE */ | |
SET @RESULT = CONCAT(@RESULT, SUB_TXT); | |
ELSE | |
/* DO STUFF WITH OTHER ITERATIONS E.G. CHANGE DELIMITER TO PIPELINE */ | |
SET @RESULT = CONCAT(@RESULT, '|', SUB_TXT); | |
END IF; | |
/* INCREMENT COUNTER */ | |
SET COUNTER = COUNTER + 1; | |
/* EXIT LOOP WHEN STRING EMPTY */ | |
IF STR_TXT = '' THEN LEAVE DO_LOOP; END IF; | |
END LOOP | |
DO_LOOP; | |
/* OUTPUT RESULT */ | |
SELECT @RESULT; | |
END$$ | |
DELIMITER ; | |
CALL LOOP_STUFF('A,B,C'); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment