Заменить подстроки из таблицы

369
14 февраля 2017, 18:57

Есть таблица 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` ,'%');

Дальше не знаю.

Answer 1

Запрос из разряда магии переменных:

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

READ ALSO
Wordpress + GIT + MySQL

Wordpress + GIT + MySQL

Добрый деньНесколько разработчиков используют GIT в работе с сайтом, который сделан на WordPress

275
Крестики-нолики 10 на 10

Крестики-нолики 10 на 10

Как написать функцию проверки isGameOver() 5ти одинаковых символов подряд? Те

380
Помогите выполнить задание [требует правки]

Помогите выполнить задание [требует правки]

Помогите пожалуйста выполнить это задание

301
BroadcastReceiver и Activity LifeCycle

BroadcastReceiver и Activity LifeCycle

Есть некоторый BroadcastReceiver, который регистрируется в методе onStart активити и деактивируется (unregister) в методе onStop

295