Используйте оконную функцию row_number()
для получения номера и replace
для манипуляции со строками .
Вы не раскрыли свою СУБД.Следующий запрос протестирован на PostgreSQL 9.0.MySQL не поддерживает оконные функции, большинство других больших СУБД поддерживают.
Переименование все имена файлов :
SELECT id
,replace(filename, '.',
'-'
|| row_number() OVER (PARTITION BY filename ORDER BY id)
|| '.')
FROM mytbl
Только переименование дубликаты имен файлов :
SELECT id
,CASE WHEN (count(*) OVER (PARTITION BY filename)) > 1 THEN
replace(filename, '.',
'-'
|| row_number() OVER (PARTITION BY filename ORDER BY id)
|| '.')
ELSE filename END AS filename
FROM mytbl;
Редактировать с помощью дополнительно запрашиваемых функций
Эта версия работает с несколькими точками в имени или без них.Протестировано в PostgreSQL 9.0.
SELECT id
,CASE WHEN (count(*) OVER (PARTITION BY filename)) > 1 THEN
regexp_replace(filename
-- pick the longest string from the start not
,'^([^.]*)'containing a '.'
-- and replace it with itself + row_number
,E'\\1-' || row_number() OVER (PARTITION BY filename ORDER BY id))
ELSE filename END AS filename
FROM mytbl