【问题标题】:How to make string keys unique by adding numeric suffix?如何通过添加数字后缀使字符串键唯一?
【发布时间】:2009-11-12 17:59:51
【问题描述】:

我有一个包含两列 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 是我的数据库)。有什么想法吗?

【问题讨论】:

  • 数据库之间的排名实现不一致,将出现的事件存储在同一列中会使您将记录关联在一起的能力变得复杂。我真的不建议做你要求的。
  • 我需要根据原始内容创建人类可读的唯一密钥。这将用于网络通信。协议无法更改。接收方和发送方共享同一个数据库的副本(只读)。你有什么推荐的?

标签: sql sqlite


【解决方案1】:

SELECT e.ID, e.Name, (SELECT COUNT(*) FROM Table1 as d WHERE d.ID

【讨论】:

  • 不客气,对不起,我没有给你 concat 部分,但我现在没有任何数据库。
【解决方案2】:

为什么不总是将主键值添加到字符串的开头(或结尾)?然后你总是可以按主键的长度对字符串进行子串,这样你总是可以得到你想要的确切字符串。

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

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

【讨论】:

  • 我想通过慢速网络发送字符串,并且字符串必须是人类可读的。所以后缀应该是最少的。
【解决方案3】:

您还没有在这里发布真正的问题,我的猜测是有一个 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

附: - 如果这些是您的真实列名,那么您对列的命名约定是可怕的。 ;)

【讨论】:

  • 谢谢,这在原则上与 Horacio N. Hdez 的解决方案相同。列名不是真实的。真正的应用程序使用必须是人类可读的预先存在的协议通过网络发送字符串。但由于某些原因,接收方必须能够重建密钥。
猜你喜欢
  • 2023-01-19
  • 1970-01-01
  • 1970-01-01
  • 2021-12-16
  • 1970-01-01
  • 2022-01-09
  • 1970-01-01
  • 2022-07-31
  • 2011-09-12
相关资源
最近更新 更多