2012-06-11 4 views
2

Я хочу снять все префиксы _ в столбце name, но результат может вызвать конфликт. Поэтому, если результат дублируется с существующими, я хочу суффиксом _, пока не будет дублирования.sql update query

В приведенном ниже примере случае _test следует переименовать в test___.

create table A 
( 
    name VARCHAR2(20) unique, 
    id int 
); 
insert into a (name, id) values ('_test', 1); 
insert into a (name, id) values ('test', 2); 
insert into a (name, id) values ('test_', 3); 
insert into a (name, id) values ('test__', 4); 
+2

Пожалуйста, положите в том, что ожидаемые результаты? – Azi

+0

Запишите триггер. –

+1

Зачем '_test' переименовываться в' test ___'? Не следует ли переименовать его в 'test' и' test' переименовать в 'test_' и так далее? –

ответ

5

Попробуйте это:

merge into A 
using (with aa as (select id, trim('_' from name) name from A) 
    select rpad(name, 
       length(name) - 1 + row_number() 
       over(partition by name order by id), 
       '_') name2, 
      id 
    from AA) s 
on (s.id = a.id) 
when matched then 
    update set a.name = s.name2 
+3

+1 Глядя на [SQL Fiddle] (http://sqlfiddle.com/#!4/331bf/2) – Andomar

+2

Лучше использовать 'TRIM ('_' FROM name)' вместо 'REPLACE', чтобы избежать замены' TE_ST 'by' TEST'. –

+0

Спасибо @PeterLang, я обновлю свой ответ –