我正在尝试为系统中的每个用户生成唯一的登录用户名。
到目前为止,我所做的是:
Select p.FirstName+P.LastName + p.PersonId from person As P
此处
1255
是主键。输出类似于JamesHarley1255
, 但是我不想使用Primarykey。还有什么 另类。也会有许多重复记录。 假设我需要一个函数,每次在1到n个数字之间生成一个唯一的数字。不知怎的,我需要像JamesHarley125那样产生输出
答案 0 :(得分:2)
试试这个,
Select p.FirstName+P.LastName +CAST(ROW_NUMBER() OVER (ORDER BY p.FirstName) AS VARCHAR(20))
from person As P
答案 1 :(得分:1)
如果您想在不使用主键列的情况下针对每条记录获取一个唯一列,我认为您可以使用行号功能。下面的查询应该适用于这种情况
Select p.FirstName+P.LastName + CAST((row_number() OVER ( PARTITION BY p.FirstName ORDER BY p.FirstName)) AS varchar(100)) from person As P
答案 2 :(得分:0)
您可以使用identity属性创建具有增量整数的列,并且可以使用第一个名称和姓氏将其连接起来。这样每一行都是唯一的。
从人As P
中选择p.FirstName + P.LastName + P.Id
此处列P.Id可以在表定义中声明如下。这将从价值' 1'开始。并将以' 1'的比例递增。身份(种子,增量)
id int IDENTITY(1,1)
答案 3 :(得分:0)
建立以前的响应,这会生成尽可能没有数字的用户名,然后只添加数字以使用户名在实际需要的地方唯一。我知道这不是您生成用户名的确切方式,但这就是我决定生成我的用户名的方式。我刚刚更改了表名以匹配你的名字。
with Usernames(PersonId, Username) as
(
select PersonId,
left(Firstname, 1) + Middlename + Lastname as Username
from Person
),
NumberedUserNames(PersonId, Username, Number) as
(
select PersonId,
Username,
ROW_NUMBER() OVER (PARTITION BY Username ORDER BY Username) as Number
from Usernames
),
UniqueUsernames(PersonId, UniqueUsername) AS
(
select PersonId,
case when Number = 1 then UserName
else UserName + CAST(Number-1 as VarChar(20))
End as UniqueUsername
from NumberedUserNames
)
select PersonId,
UniqueUsername
from UniqueUsernames;