Skip to content

Instantly share code, notes, and snippets.

@saxenap
Forked from mattdexter/mysql_list_loop.sql
Created May 23, 2018 23:25
Show Gist options
  • Save saxenap/2cc62a9dcbbfa715bef801bc5698c9b0 to your computer and use it in GitHub Desktop.
Save saxenap/2cc62a9dcbbfa715bef801bc5698c9b0 to your computer and use it in GitHub Desktop.
MySQL Stored Procedure to Loop Delimited List
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