sql - T-SQL 截断文本并在末尾添加数字以避免重复

标签 sql sql-server sql-server-2008 tsql sql-server-2012

我需要将一列中的数据截断为 10 个字符。但是,我不能有任何重复项,因此我希望任何重复项以 ~1 作为第一个重复项,以 ~2 作为第二个重复项。这是我所拥有的一个示例:

Column
------
The ABC Company Inc.
The ABC Cooperative
XYZ Associates LLC.

我希望结果是:

Column
------
The ABC ~1
The ABC ~2
XYZ Associ

结尾不一定是~1 或~2,我只需要在截断后让它独一无二。截断后可能有超过 3 或 4 个重复。

到目前为止,我只是手动截断和编辑表格:

update Table set Column = Left(Column, 10) where len(Column) > 10

最佳答案

首先,您关心的是前 8 个字符,而不是前 10 个,因为您需要为额外的数字预留位置。

假设您的重复次数少于 10 次,您可以这样做:

with toupdate as (
      select t.*,
             row_number() over (partition by left(col, 8) order by (select null)) as seqnum,
             count(*) over (partition by left(col, 8) ) as cnt
      from t
update toupdate
    set col = (case when cnt = 1 then left(col, 10)
                    else left(col, 8) + '~' + cast(seqnum as char(1));

同样的想法也可以用于select

关于sql - T-SQL 截断文本并在末尾添加数字以避免重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38594498/

相关文章:

sql-server - 如何在 SQL 循环中 INSERT INTO 表 300 次?

sql - 此过程的游标替代方案?

sql-server - VistaDB有什么缺点

sql - 在不使用 DBCC 的情况下确定每个 SQL 表的页数

sql - 使用内部联接在 View 上启用全文搜索

c# - 使用 "Using"时在Finally中关闭SqlConnection

sql - 删除 SQL 中 created_at 的毫秒部分以与其他日期时间进行比较

sql-server-2008 - 如何通过传递参数使用Ms-Access形式执行Sql服务器存储过程

MySQL phpmyadmin 创建表错误

sql - 在 SQLClient 中访问 Hive 表,但不能从 Putty 中访问