【问题标题】:How to replace values which are equal in a column in SQL?如何替换SQL中列中相等的值?
【发布时间】:2015-12-07 05:40:13
【问题描述】:

我在具有相同字符串值的表中有以下列。我需要替换相等的字符串,例如:

+----+-------------+
| ID | Column_Name |
+----+-------------+
|  1 | Imports     |
|  2 | Imports     |
|  3 | Exports     |
|  4 | Exports     |
+----+-------------+

需要替换为:

+----+-------------+
| ID | Column_Name |
+----+-------------+
|  1 | Imports1    |
|  2 | Imports2    |
|  3 | Exports1    |
|  4 | Exports2    |
+----+-------------+

有没有办法在 SQL 查询中实现这一点?

这样做的目的是我使用 'Column_Name' 字符串 动态 SQL 中的值来替换整数值,因为 相同的名称列的不同值没有得到 替换了。

【问题讨论】:

  • 你能展示一个扩展的样本数据集吗? ID 编号方案和列名是否有任何顺序?
  • 不,我创建了一个 ID 为 (Integer identity) 的临时表...列名具有根据插入的 ID 值。我所需要的只是用一些替代名称或数字替换类似的字符串名称....感谢您的评论:)

标签: sql sql-server-2008


【解决方案1】:

你可以试试这个:

UPDATE Your_Table
SET Name = Name + CAST(RN AS varchar(1)) FROM -- varchar(10)
                    (SELECT ROW_NUMBER() OVER(PARTITION BY Name ORDER BY ID) AS RN
                     FROM Your_Table) AS A

【讨论】:

  • 不客气。 P/s:CAST(RN AS varchar(1))只支持1-->9,如果你想要更多,你可以扩展varchar(n) -- n=2 (1-->99), n=3 (1-->999),...
  • 嗨...当我使用查询时,所有字符串名称都附加了数值1..
【解决方案2】:

这是一个实现你想要的单曲。它执行两个内部查询的联合,每个内部查询从 1 开始编号 ImportExport 记录,按其原始 ID 值的顺序排列。外部查询选择ID 以及新的Column Name

SELECT ID, CONCAT([Column Name], NewID)
FROM
(
    SELECT ID, [Column Name],
    ROW_NUMBER() OVER (ORDER BY ID ASC) AS NewID
    FROM your_table
    WHERE [Column Name] = 'Exports'
    UNION ALL
    SELECT ID, [Column Name],
        ROW_NUMBER() OVER (ORDER BY ID ASC) AS NewID
    FROM your_table
    WHERE [Column Name] = 'Imports'
)
ORDER BY ID ASC

【讨论】:

  • 它工作,但只是选择,我想他会更新他的表:)
  • 感谢@NguyễnHảiTriều,您的回答更加简洁。如果有人只想选择,我会保留它。
  • 我担心CONCAT 将从 2012 年开始提供。
  • @Ragul 您提供的链接似乎表明CONCAT 在 SQL Server 2008 及更高版本中可用。这是一个比较老的功能。
猜你喜欢
  • 2020-02-12
  • 2019-10-19
  • 2017-05-10
  • 2013-09-29
  • 2021-06-10
  • 1970-01-01
  • 2021-04-11
  • 2014-01-26
  • 2015-08-20
相关资源
最近更新 更多