MYSQL - разобрать разделенную запятыми строку чисел и сравнить каждый из них, чтобы установить число - PullRequest
0 голосов
/ 21 марта 2019

У меня есть требование в MySQL взять строку чисел, разделенных запятыми ("2000, 2001, 2002, 2003, 2004"), переданную в хранимую процедуру, и сравнить каждое из них с другим числом, например, 2005. Если любое из чисел больше или равно моей цели 2005, мне нужно выполнить код, иначе выйти из цикла. Я не могу понять, как перебрать эту строку, разделенную запятыми, превратить каждую в число с помощью CAST() и сравнить его с моим целевым числом.

Ответы [ 2 ]

0 голосов
/ 22 марта 2019

Определил процедуру следующим образом.

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");
0 голосов
/ 22 марта 2019

Если предположить, что аргумент, переданный в процедуру, имеет имя 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...