Есть таблица ForgeRock
, которая содержит поле name
. В поле ForgeRock.name
, необходимо выполнить замену подстроки из ReplaceData.cut
на данные из поля ReplaceData.paste
CREATE TABLE ForgeRock
(`id` int,
`name` varchar(77),
`description` varchar(55)
);
INSERT INTO ForgeRock
(`id`, `name`, `description`)
VALUES
(1, 'OpenIDM', 'Platform for building enterprise provisioning for solutions'),
(2, 'OpenAM', 'Full-featured access management'),
(3, 'OpenDJ', 'Robust LDAP server for Java');
CREATE TABLE ReplaceData
(`id` int,
`fieldNaame` varchar(77),
`f2` varchar(55),
`f2` varchar(55)
);
INSERT INTO ReplaceData
(`id`, `cut`, `paste`)
VALUES
(1,,'Open', 'Close'),
(2,'IDM', 'xxxxx');
После отработки "нашей" замены, должно получится примерно такое
(1, 'Closexxxxx', 'Platform for building enterprise provisioning for solutions'),
(2, 'CloseAM', 'Full-featured access management'),
(3, 'CloseDJ', 'Robust LDAP server for Java');
Первое, что приходит на ум:
UPDATE `ForgeRock` d, `ReplaceData` t
SET d.`name` = replace(d.`name`, t.`cut`, t.`paste`)
Второе:
UPDATE `ForgeRock` d, `ReplaceData` t
SET d.`name` = replace(d.`name`, t.`cut`, t.`paste`)
where d.`name` LIKE CONCAT('%', t.`cut` ,'%');
Дальше не знаю.
Запрос из разряда магии переменных:
update `ForgeRock` u
join (
select name, new
from (
select d.*,
@cur:=if(@grp=d.name,@cur,d.name),
@cur:=replace(@cur, t.`cut`, t.`paste`) new,
@n:=if(@grp=d.name,@n+1,1) N,
@grp:=d.name
from `ForgeRock` d, `ReplaceData` t, (select @cur:='',@grp:='',@n:=0) A
order by d.name
) X
where N=@n
) N
on u.name=N.name
set u.name=N.new
В подзапросе данные последовательно заменяются с каждой новой строкой. @grp
служит для запоминания текущего обрабатываемого имени и получении нового значения для @cur (текущего состояния замененной строки) при переходе к следующему имени. @n
нумерует записи, все замены прошли, когда номер текущей строки равен количеству строк замены. А количество строк замены остается в переменной @n
после выполнения самого глубокого подзапроса и в внешнем запросе уже можно сравнить номер строки с максимальным (where N=@n
). Остается подклеить это к изменяемой таблице и заменить.
Пример на sqlfiddle.com
Оборудование для ресторана: новинки профессиональной кухонной техники
Частный дом престарелых в Киеве: комфорт, забота и профессиональный уход
Добрый деньНесколько разработчиков используют GIT в работе с сайтом, который сделан на WordPress
Как написать функцию проверки isGameOver() 5ти одинаковых символов подряд? Те
Есть некоторый BroadcastReceiver, который регистрируется в методе onStart активити и деактивируется (unregister) в методе onStop