SQL:在扩展名之前添加1,2,3 ...重命名重复的文件名

时间:2011-11-06 16:53:32

标签: sql duplicates rename increment

我正在试图弄清楚如何重命名存储文件名的列的内容。目前在这个字段中有重复项,我试图通过在每个副本之后添加一个增量整数来重命名,例如

ID       | FILENAME
----------------------
1        | file1.ext
2        | file2.ext
3        | file1.ext
4        | file1.ext
5        | file3.ext
6        | file3.ext
7        | file4.ext

所以在上面的例子中,我希望以下内容是唯一的:

ID       | FILENAME
----------------------
1        | file1.ext
3        | file1.ext
4        | file1.ext
5        | file3.ext
6        | file3.ext

将文件名更改为:

ID       | FILENAME
----------------------
1        | file1-1.ext
3        | file1-2.ext
4        | file1-3.ext
5        | file3-1.ext
6        | file3-2.ext

我知道如何找到重复项,但我不知道如何在扩展名之前添加增量或如何在第一位增加计数。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

使用window function row_number()获取string manipulation的号码和replace
您没有透露您的RDBMS。以下查询在PostgreSQL 9.0上进行了测试。 MySQL不支持窗口函数,大多数其他大型RDBMS都支持。

重命名所有文件名

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