1
DROP TABLE #ABC
CREATE TABLE #ABC (ID INT NOT NULL, Name VARCHAR (2) NOT NULL, name2 VARCHAR(2))
INSERT INTO #ABC (ID, NAME)
VALUES (1,'01'),(1,'F5'),(1,'05'),(1,'08'),(1,'02'), (1,'03'), (1,'04'), (1,'06'),(1,'07'),(1,'09'),(1,'10'),(1,'11'),(1,'12'),(1,'13'),(1,'14'),
(1,'15'),(1,'2D'),(1,'2E'),(1,'4B'),(1,'5F'),(1,'64'),(1,'73'),(1,'83'),(1,'88'),(1,'A9'),(1,'AC'),(1,'D0'),(1,'D7'),(1,'15'),(2,'76'),(2,'J5')

我用来填充 name2 的脚本(不起作用)

UPDATE A
SET name2 = SUBSTRING(REPLACE(CONVERT(VARCHAR(36), NEWID()) , '-', ''), 0, 3)
FROM #ABC AS A

select * from #ABC

所以,我已经用 ID 和 NAME 填充了表#ABC,我想填充“Name2”,以便“name2”不应该具有与相同 ID 的“name”相同的值。例如,对于 ID = 1 ,所有 name2 值都应该不同于 name 值。谢谢

4

1 回答 1

0

看起来您正在使用 SQL Server。如果是这样,您可以使用该row_number()函数将唯一标识符附加到末尾name

with toupdate as (
      select t.*, row_number() over (partition by id order by name desc) as num
      from #abc t
     )
update toupdate
    set name2 = cast(num as varchar(2))

这将适用于给定 id 的最多 99 个重复项。

不幸的是,我现在没有可用的 SQL Server。但这里有一个想法。您可以取 name 的最大值,然后进行算术运算,以 36 为底(26 个字母和 10 个数字)。结果是这样的:

with toupdate as (
      select t.*, row_number() over (partition by id order by name desc) as seqnum,
             max(name) over (partition by id) as maxname,
             ((case when left(name, 1) between '0' and '9'
                    then ascii(left(name, 1))
                    else ascii(upper(left(name, 1))) - ascii('A')+10
               end) * 36 +
              (case when right(name, 1) between '0' and '9'
                    then ascii(right(name, 1))
                    else ascii(upper(right(name, 1))) - ascii('A')+10
               end)
             ) as namenum
      from #abc t
     )
update toupdate
    set name2 = (case when (namenum+seqnum)/36 < 10
                      then char(ascii('0')+((namenum+seqnum)/36))
                      else char(ascii('A')+((namenum+seqnum)/36) - 10)
                 end)+
                (case when ((namenum+seqnum)%36) < 10
                      then char(ascii('0')+((namenum+seqnum)%36))
                      else char(ascii('A')+((namenum+seqnum)%36) - 10)
                 end)

这将找到最大名称,然后生成大于该名称的名称。这假定您仅使用字母字符(大写)和数字。如果name取值接近最大可能值('ZZ'在这种情况下),它可能会失败。

于 2013-05-08T00:25:59.620 回答