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