MYSQL-解析逗号分隔的数字字符串,并将每个数字与设置的数字进行比较

时间:2019-03-21 20:44:33

标签: mysql sql stored-procedures

我在MySQL中要求将逗号分隔的数字字符串("2000, 2001, 2002, 2003, 2004")传递到存储过程中,并将每个数字与另一个数字进行比较,例如2005。如果任何数字大于或等于我的目标2005,则需要执行代码,否则请退出循环。我无法弄清楚如何遍历此逗号分隔的字符串,使用CAST()将每个字符串转换为数字,并将其与目标数字进行比较。

2 个答案:

答案 0 :(得分:0)

假定传递给该过程的参数名为arg_list ...

如果要求确定列表中是否只有一些(零以外的任何数字)条目大于2005,则

然后我们可以在该过程中执行以下操作:

一个循环迭代器和一些工作区域:

DECLARE i_          INT          DEFAULT 0;
DECLARE ls_number   VARCHAR(255) DEFAULT '';
DECLARE ls_greatest VARCHAR(255) DEFAULT '';

初始化,获得列表中的第一个数字,到目前为止列表中的第一个数字最大:

SET i_ := 1;
SET ls_number := TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT(  arg_list  ,','),',',i),',',-1));
SET ls_greatest := ls_number;

WHILE ls_number > '' DO
   -- evaluate as numeric and compare
   IF ls_number+0 > ls_greatest+0 THEN 
      -- the one we just got is the biggest one so far, so keep it
      SET ls_greatest := ls_number;
   END IF;
   -- get next number in list
   SET i_ := i_ + 1;
   SET ls_number := TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT(  arg_list  ,','),',',i),',',-1));
END WHILE;

-- ls_greatest now contains the largest number from the list  
IF ls_greatest+0  >= 2005 THEN 
   -- do some code 
END IF;

注意:这假设arg_list中的列表格式正确,并且不包含虚假逗号,例如如果列表是'1,2,3,,4,5',则循环将在处理3

之后退出

答案 1 :(得分:0)

定义以下步骤。

DELIMITER //

CREATE PROCEDURE getValue(txt varchar(100), abc varchar(100))
BEGIN 
    SET @i = 1;
    SET @txt = REPLACE(txt, '"', '');
    SET @last_element = SUBSTRING_INDEX(@txt, ",", -1);

    WHILE @txt != '' DO
        SET @element = SUBSTRING_INDEX(@txt, ",", @i);

        IF CAST(abc AS UNSIGNED) >= CAST(@element AS UNSIGNED)  THEN
            # execute your code
            SET @txt = '';
        ELSE
            IF !LOCATE(',',@txt) && @element = @last_element THEN
                # @element = @last_element comparison is not necessary
                SET @txt = '';
            ELSE
                SET @txt = REPLACE(@txt, CONCAT(@element,","), '');
            END IF;
        END IF;
    END WHILE;

END //

DELIMITER ;

尝试了以下两个过程调用。

call getValue("200,400,100","100");
call getValue("200,400,600","100");