Oracle SQL-生成基于模式的唯一用户ID

时间:2019-01-22 18:26:48

标签: sql regex oracle

我需要使用Oracle SQL过程生成唯一的UserID。对于用户John Smith,应使用以下条件生成UserID:

  1. 名字和姓氏的首字母:jsmith

  2. 如果存在另一个具有相同名称的用户:名字的第一个字母+名字的第二个字母+姓氏:josmith

  3. 对于另一个副本:名字的第一个字母+名字的第二个字母+名字的第三个字母+姓氏:johsmith

  4. 对于另一个副本:名字的第一个字母+名字的第二个字母+名字的第三个字母+名字的第四个字母+姓:johnsmith

  5. 我们不断进行迭代,直到用尽所有姓氏的字母

  6. 当我们用完名字的字母后,仍然有重复的,我们会在末尾附加一个数字:johnsmith1

  7. 对于其他重复项,我们会不断增加结尾处的数字:johnsmith1johnsmith2等。

我正在寻找构想,以作为优化和可扩展解决方案的起点。

1 个答案:

答案 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;