如何通过添加数字后缀使字符串键唯一?

时间:2009-11-12 17:59:51

标签: sql sqlite

我有一个包含两列n整数和s varchar的表。 n是主键。 s大多是独一无二的但并不总是如此例如

n   s
1   New York
2   Moscow
3   Paris
4   London
5   Moscow
6   Berlin
7   Moscow

我想创建另一个具有相同结构的表,相同的行数除外,通过向第二个和更多的出现添加数字后缀,s将变为唯一。例如:

n   s
1   New York
2   Moscow
3   Paris
4   London
5   Moscow 2
6   Berlin
7   Moscow 3

以独立于平台的方式在单个SQL命令中(sqlite是我的数据库)。有什么想法吗?

3 个答案:

答案 0 :(得分:5)

SELECT e.ID,e.Name,(SELECT COUNT(*)FROM Table1 as d WHERE d.ID< e.ID AND d.Name = e.Name)FROM Table1 as e;

答案 1 :(得分:0)

为什么不总是将主键值添加到字符串的开头(或结尾)?然后,您始终可以按主键的长度对字符串进行子字符串处理,这样您就可以随时获得所需的字符串。

因此您的数据可能如下所示:

n   s
1   1New York
2   2Moscow
3   3Paris
4   4London
5   5Moscow
6   6Berlin
7   7Moscow
.
.
.
100995 100995Paris

答案 2 :(得分:0)

你还没有在这里发布真正的问题,我的猜测是有一个 MUCH 更好的解决方案,然后你想做什么。话虽这么说,下面的代码应该给你你想要的。使用它是你自己的危险。

我最近几乎一直在使用MS SQL,但我认为这主要是ANSI兼容的。例外是RTRIM功能。 ANSI标准中有一个TRIM函数,但在使用RTRIM和LTRIM的Transact-SQL中似乎不支持。

SELECT
     n,
     RTRIM(s + ' ' + COALESCE
     (
          (
          SELECT
               NULLIF(CAST(COUNT(*) AS VARCHAR(10)), 0) AS cnt
          FROM
               Some_Table T2
          WHERE
               T2.s = T1.s AND
               T2.n < T1.n
          ), ''
     )) AS s
FROM
     Some_Table T1

P.S。 - 如果这些是你真正的列名,你的列的命名约定是可怕的。 ;)