Intereting Posts
В чем разница между вложенным массивом и ассоциативным массивом? Обновление нескольких строк в одном запросе с помощью PostgreSQL TSQL: вызов хранимой процедуры из другой хранимой процедуры и чтение результата Oracle – группировка между парами записей Использование связанного сервера возвращает ошибку – «Не удается получить набор строк схемы для поставщика OLE DB» Как вставить подсказку «Оптимизатор» в запрос Hibernate критериев api Как получить все различные комбинации из 2 столбцов в MySQL SQL to JSON – массив объектов для массива значений в SQL 2016 Прежде чем писать дату Java в столбец SQL TIMESTAMP, JDBC переводит дату из часового пояса JVM в часовой пояс базы данных? Нужна помощь в создании запроса для нескольких таблиц в доступе Имя файла в предложении WHERE Mysql ничего не возвращает LOAD DATA INFILE для загрузки данных в разные таблицы MySQL to PostgreSQL: как изменить этот SQL-запрос? Запрос PostgreSQL для обнаружения перекрывающихся временных диапазонов Укажите количество записей в базе данных с 5-минутными интервалами

mysql: разделить значение varchar и вставить части

У меня есть денормализованные записи в моей таблице:

ID, CODES 1 |1|2|3|4 2 |5|6|7|8 

Во втором столбце есть значения int, сохраненные в поле varchar, разделенные символом | символ. Я хочу преобразовать их в нормальную многоязычную реляционную форму, используя таблицу ссылок. Поэтому я хочу создать таблицу, подобную этой

 ID CODE 1 1 1 2 1 3 1 4 .... 2 8 

Я понимаю, что я могу перебирать записи в хранимой функции mysql, разделять строку и значение вставки. Но мне интересно: возможно ли преобразовывать данные таким образом без хранимой процедуры / функции, но используя только запрос (create table … select …)? Благодарю.

UPD: переменное количество кодов в разных строках. Каждая строка имеет от 1 до 15 кодов.

Вот как это работает, включая тестовые данные и так далее.

Но подумайте, что это всего лишь забавный ответ. Способ перехода – это, очевидно, хранимая процедура или функция или что-то еще.

 drop table testvar; create table testvar (id int, codes varchar(20)); insert into testvar values (1, '|1|2|3|4'), (2, '|5|6|7|8'); drop table if exists inserttest; create table inserttest (id int, code int); select @sql:=left(concat('insert into inserttest values ', group_concat( '(', id, ',', replace(right(codes, length(codes) - 1), '|', concat( '),(', id, ',' )), '),' separator '')), length(concat('insert into inserttest values ', group_concat( '(', id, ',', replace(right(codes, length(codes) - 1), '|', concat( '),(', id, ',' )), '),' separator ''))) -1) from testvar; prepare stmt1 from @sql; execute stmt1; select * from inserttest; 

Способ Oracle:

 insert into newtestvar select t.id, to_number(substr(t.codes, p1 + 1, p2)) from ( select testvar.id, testvar.codes, s.num, instr(testvar.codes, '|',1,s.num) p1, instr(testvar.codes||'|', '|',1,s.num + 1)- instr(testvar.codes, '|',1,s.num) - 1 p2 from testvar, (select level num from dual connect by level <= 15) s where s.num <= (length(testvar.codes)-length(replace(testvar.codes, '|'))) ) t; 

Надеюсь, вы сможете адаптировать его для mysql.