我正在试图弄清楚如何重命名存储文件名的列的内容。目前在这个字段中有重复项,我试图通过在每个副本之后添加一个增量整数来重命名,例如
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
我知道如何找到重复项,但我不知道如何在扩展名之前添加增量或如何在第一位增加计数。
非常感谢任何帮助。
答案 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