我需要使用Oracle SQL过程生成唯一的UserID。对于用户John Smith
,应使用以下条件生成UserID:
名字和姓氏的首字母:jsmith
如果存在另一个具有相同名称的用户:名字的第一个字母+名字的第二个字母+姓氏:josmith
对于另一个副本:名字的第一个字母+名字的第二个字母+名字的第三个字母+姓氏:johsmith
对于另一个副本:名字的第一个字母+名字的第二个字母+名字的第三个字母+名字的第四个字母+姓:johnsmith
我们不断进行迭代,直到用尽所有姓氏的字母
当我们用完名字的字母后,仍然有重复的,我们会在末尾附加一个数字:johnsmith1
对于其他重复项,我们会不断增加结尾处的数字:johnsmith1
,johnsmith2
等。
我正在寻找构想,以作为优化和可扩展解决方案的起点。
答案 0 :(得分:0)
此查询根据名字和姓氏生成前100个帐户名称建议(可以随意调整生成的选项的数量)。
with acc as (
select rownum id, 'John' fname, 'Smith' lname from dual connect by level <=100
)
select
id,
case when id <= length(fname) then
substr(fname,1,id)||lname
else
fname||lname||to_char(id-length(fname)) end as account_name
from acc;
ID ACCOUNT_NAME
---------- -------------------------------------------------
1 JSmith
2 JoSmith
3 JohSmith
4 JohnSmith
5 JohnSmith1
6 JohnSmith2
7 JohnSmith3
8 JohnSmith4
9 JohnSmith5
....
如果您有一个分配了帐户名的表,例如user_accounts
,则可以打开此光标并获取第一行。这将根据您的规则提供一个新的免费帐户名。
with acc as (
select rownum id, 'John' fname, 'Smith' lname from dual connect by level <=100
), acc2 as (
select
id,
case when id <= length(fname) then
substr(fname,1,id)||lname
else
fname||lname||to_char(id-length(fname)) end as account_name
from acc)
select id, account_name from acc2
where account_name not in
(select account_name from user_accounts)
order by id;