Частичный перенос строки

makson_a

Доброго времени суток, товарищи.необходимо выполнить групповой Update, для этого нужно "отрезать" кусок строки и "приклеить" его к другой, проблема в том что вид строк такой:num | id _________________ 89998811_up | 1 89998811 | 2понимаю, что необходимо использовать substr, вырезать _up легко, а вот как переместить его с записи на запись- вопрос. Надеюсь на помощь, понимание (стаж 2 недели) и минимальный хейт.
3 ответа

makson_a

--находим все записи, которые следует проапдейтить
MERGE INTO TABLE t
USING (SELECT t.id FROM TABLE t JOIN TABLE z ON t.num = substr(z.num,1,instr(z.num,'_up')-1)) z
ON (t.id = z.id) 
WHEN matched THEN UPDATE
 SET t.num = t.num||'_updated'
 
--убираем "up" у всех "старых" записей
UPDATE TABLE t
SET t.num = substr(t.num,1,instr(t.num,'_up')-1)
WHERE t.num LIKE '%_up'
 
--подменяем "updated" на "up" у проапдейченых записей
UPDATE TABLE t
SET t.num = substr(t.num,1,instr(t.num,'_updated')+2)
WHERE t.num LIKE '%_updated'
Можно заменить мердж на апдейт
UPDATE TABLE t
 SET t.num =t.num||'_updated'
WHERE EXISTS (SELECT z.id FROM TABLE z WHERE substr(z.num,1,instr(z.num,'_up')-1) = t.num)
И последний апдейт сделать "попроще"
UPDATE TABLE t
SET t.num = REPLACE(t.num,'_updated','_up')
WHERE t.num LIKE '%_updated'


makson_a

это, конечно, хороший, простой и понятный, как функционал топора, метод, но не создаст ли он огромную нагрузку на бд, где таких записей 500+ ?


makson_a

не создаст ли он огромную нагрузку на бд
Вообще-то любой update (равно как и select c delete) дает некую нагрузку на БД. Решить вопрос огромности можно только в том случае, если совершенно точно определить, что именно и откуда мы отрезаем, а также и куда именно и по каким правилам приклеиваем. Без точной постановки задачи обсуждать вопрос нагрузки на БД бессмысленно.Для Oracle 500+ - это мало. Мне приходилось апдейтить и миллион, и даже больше. Другое дело, если для того, чтобы проапдейтить 500, надо перелопатить 500 миллионов.