Есть ли что-то аналогичное методу split () в mySql?

Я ищу написать хранимую процедуру, которая принимает в качестве параметра строку, разделенную токеном, а затем запустить цикл while в процедуре для каждого элемента в этой строке.

В документации по mysql я не вижу ничего, что могло бы решить эту задачу ... есть ли способ сделать это?

Ответы на вопрос(3)

SUBSTRING_INDEX

Это не так просто, как просто функция split (), но я уверен, что с этой функцией вы можете создать цикл while.

Решение Вопроса

mysql не позволяет функциям возвращать массивы или таблицы (о которых я знаю), поэтому вы должны сделать это немного хамски.

Вот пример сохраненного процесса:

DELIMITER $

create function splitter_count (str varchar(200), delim char(1)) returns int
  return (length(replace(str, delim, concat(delim, ' ')))  - length(str)) $

CREATE PROCEDURE tokenize (str varchar(200), delim char(1))
BEGIN
  DECLARE i INT DEFAULT 0;
  create table tokens(val varchar(50));
  WHILE i <= splitter_count(str, delim) DO
    insert into tokens(val) select(substring_index(SUBSTRING_INDEX(str, delim, i+1), delim, -1));
    SET i = i + 1;
  END WHILE;

END $

DELIMITER ;

Это токенизирует вашу строку и вставляет значения в таблицу с именем «токены», по одному токену на строку. Вы должны быть в состоянии изменить это, чтобы сделать что-то полезное довольно легко. Также вы можете увеличить длину ввода с 200.

тебе нужно будет выполнить свою собственную функцию. substring_index пригодится:

SUBSTRING_INDEX(str,delim,count)

Возвращает подстроку из строки str до подсчета вхождений разделителя. Если число положительное, возвращается все слева от конечного разделителя (считая слева). Если счетчик отрицателен, возвращается все справа от конечного разделителя (считая справа). SUBSTRING_INDEX () выполняет поиск с учетом регистра при поиске разделителя.

mysql> SELECT SUBSTRING_INDEX('www.mysql.com', '.', 2);
        -> 'www.mysql'
mysql> SELECT SUBSTRING_INDEX('www.mysql.com', '.', -2);
        -> 'mysql.com'

Эта функция является многобайтовой.

Ваш ответ на вопрос