Требования: разделить столбец с разделителями на строки (таблицу).
Почему? Вы можете использовать все функции SQL Aggregate для обработки строк.
Working SQLFiddle
Связанные вопросы, которые используют этот код:
Я решил использовать:
таблица целых чисел (integersequence), которая при соединении «внутренняя соединенная» или «крест» (одна и та же вещь) с другой таблицей будет генерировать строки, которые, несомненно, будут иметь уникальный порядковый номер, начиная с 1. Это просто используется какие RDBMS-двигатели должны делать.
Почему таблица целых чисел ?: Она небольшая и загружается в кеш. Это легко понять.
Вместо того, чтобы иметь много кода в запросе, который скрывает то, что он на самом деле делает. Я использую функции, выполняющие одно задание. Он упрощает основной запрос и может быть проверен и проверен отдельно. На данный момент меня беспокоит простота обслуживания и понимания.
Пример здесь для одной строки. Однако его можно легко расширить до таблицы разделенных строк разных размеров. «Cross join» создаст все возможные варианты индекса, начиная с 1 при присоединении к integersequence
(мне действительно нужно использовать другое имя: - /).
Таким образом, запрос:
SET @StrToParse = "asdasdwdfef,rgrgtggt,weef";
/* example */
select integerseries.id,
count_in_set(@StrToParse, ','),
value_in_set(@StrToParse, ',', integerseries.id)
from integerseries
where integerseries.id <= count_in_set(@StrToParse, ',');
Выход:
PositionOfString, CountOfCommaDelimitedStrings, StringAtThatPosition
1 3 asdasdwdfef
2 3 rgrgtggt
3 3 weef
Теперь, как мы получаем эти значения:
Я решил использовать две функции:
Имена относятся к функции mysql
'FIND_IN_SET'.
1) Функция COUNT_IN_SET
: возвращает счет character delimited items
в колонке.
CREATE FUNCTION `COUNT_IN_SET`(haystack VARCHAR(1024),
delim CHAR(1)
) RETURNS INTEGER
BEGIN
RETURN CHAR_LENGTH(haystack) - CHAR_LENGTH(REPLACE(haystack, delim, '')) + 1;
END$$
2) VALUE_IN_SET
функции: рассматривает delimited list
как one based array
и возвращает значение в данном индексе «».
CREATE FUNCTION `VALUE_IN_SET`(haystack VARCHAR(1024),
delim CHAR(1),
which INTEGER
) RETURNS VARCHAR(255) CHARSET utf8 COLLATE utf8_unicode_ci
BEGIN
RETURN SUBSTRING_INDEX(SUBSTRING_INDEX(haystack, delim, which),
delim,
-1);
END$$
intereseries стол - см (таблицы Tally)
CREATE TABLE `integerseries` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=500 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
/*Data for the table `integerseries` */
insert into `integerseries`(`id`) values (1);
insert into `integerseries`(`id`) values (2);
insert into `integerseries`(`id`) values (3);
insert into `integerseries`(`id`) values (4);
insert into `integerseries`(`id`) values (5);
insert into `integerseries`(`id`) values (6);
insert into `integerseries`(`id`) values (7);
insert into `integerseries`(`id`) values (8);
insert into `integerseries`(`id`) values (9);
insert into `integerseries`(`id`) values (10);
Не можете заставить его работать на sqlfiddle, но разве вы не просто потеряете _data в своем заявлении insert? IE INSERT INTO _RtnValue (описание) SELECT LTRIM (RTRIM (SUBSTRING (_RowData, 1, _FoundIndex - 1))); – user1515791
@ user1515791 Я объявляю свою _data "DECLARE _Data varchar (255);" и ошибка отсутствует, но выход равен NULL. – user3441151
@ user1515791 Я просто обновляю свой пост, пожалуйста, проверьте его снова. – user3441151