gpt4 book ai didi

sql-server - 发现重复时将字符附加到字符串

转载 作者:行者123 更新时间:2023-12-02 20:26:17 25 4
gpt4 key购买 nike

假设我有一个 ID、名称表和一个用于标记更新的字段,如下所示:

+----+-------+---------+
| ID | Name | Update? |
+----+-------+---------+
| 1 | A | y |
| 2 | B | y |
| 3 | xxB | |
| 4 | C | |
| 5 | D | y |
| 6 | xxD | |
| 7 | xxxD | |
| 8 | E | |
+----+-------+---------+

“更新”是在名称后面附加一个“xx”,但是表中不能有重复的名称,因此我想在找到的任何重复名称后面附加一个“x”。因此,对于这一点,表格将更新为:

+----+-------+---------+
| ID | Name | Update? |
+----+-------+---------+
| 1 | xxA | |
| 2 | xxB | |
| 3 | xxxB | |
| 4 | C | |
| 5 | xxD | |
| 6 | xxxD | |
| 7 | xxxxD | |
| 8 | E | |
+----+-------+---------+

关于执行此操作的最佳方法有什么想法吗?它是在我坚持的初始更新中发生的重复项更新,我不确定让它重新检查并更新所有级别的重复项有多么容易,例如 A 不重复, B 为 1 级,D 为 2 级,依此类推。

谢谢,戴夫

最佳答案

试试这个:

SQL Fiddle

WITH CteUpdate AS(
SELECT *,
base = REPLACE(Name, 'x', ''),
xxName = REPLICATE('x',
ROW_NUMBER() OVER(
PARTITION BY REPLACE(Name, 'x', '')
ORDER BY ID
) + 1
) + REPLACE(Name, 'x', '')
FROM TestData
WHERE
REPLACE(Name, 'x', '') IN(
SELECT Name FROM TestData WHERE [Update] = 1
)
)
UPDATE CteUpdate
SET Name = xxName
, [Update] = 0

结果:

ID          Name       Update
----------- ---------- ------
1 xxA 0
2 xxB 0
3 xxxB 0
4 C 0
5 xxD 0
6 xxxD 0
7 xxxxD 0
8 E 0
<小时/>

首先,您想要获取具有相同基本 Name 的所有行(Name 减去 xx),并且这些行具有更新 = 1。要获取基本 Name,只需将 x 替换为 '':

SELECT *, 
base = REPLACE(Name, 'x', '')
FROM TestData
WHERE
REPLACE(Name, 'x', '') IN(
SELECT Name FROM TestData WHERE [Update] = 1
)

上面的结果将是:

ID          Name       Update base
----------- ---------- ------ ------
1 A 1 A
2 B 1 B
3 xxB 0 B
5 D 1 D
6 xxD 0 D
7 xxxD 0 D

然后,您要使用ROW_NUMBER OVER(PARTITION BY base ORDER BY ID)。生成的 ROW_NUMBER + 1 将是要添加到 base

上的 x 数量
WITH CteUpdate AS(
SELECT *,
base = CAST(REPLACE(Name, 'x', '') AS VARCHAR(1))
FROM TestData
WHERE
REPLACE(Name, 'x', '') IN(
SELECT Name FROM TestData WHERE [Update] = 1
)
)
SELECT
RN = ROW_NUMBER() OVER(PARTITION BY base ORDER BY ID),
xxName = REPLICATE('x', ROW_NUMBER() OVER(PARTITION BY base ORDER BY ID) + 1) + base
FROM CteUpdate

上述查询的结果将是:

ID          Name       Update base   RN    xxName
----------- ---------- ------ ------ ----- ---------
1 A 1 A 1 xxA
2 B 1 B 1 xxB
3 xxB 0 B 2 xxxB
5 D 1 D 1 xxD
6 xxD 0 D 2 xxxD
7 xxxD 0 D 3 xxxxD

xxName 现在将是更新后的Name

关于sql-server - 发现重复时将字符附加到字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30229776/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com