2015-01-12 136 views
-1

我想生成userID,邏輯是,UserID是FirstName和LastName的組合。如果userID已經存在,則在FirstName和LastName後面加1。如何通過SQL生成用戶ID

例如:

用戶John Doe的用戶ID將是JohnDoe。

如果另一個John Doe加入公司,那麼UserID應該是JohnDoe1等等。

我正在使用的案例陳述是在下面。

Select distinct case 
when lower(a.First_Name) || lower(a.Last_Name) = b.Name then a.First_Name || a.Last_Name || 1 
when lower(a.First_Name) || lower(a.Last_Name) || 1 = b.Name then a.First_Name || a.Last_Name || 2 

else a.first_name || a.last_name 
end as user_id from Users a, accounts b 

where a.unique_id = '12345' (This is matching key from table B) 

在我的表中,我已經有了用戶ID JohnDoe和JohnDoe1。

和輸出我得到上述查詢的是,

JOHNDOE JohnDoe1 JohnDoe2

如何我只得到JohnDoe2作爲輸出。

+1

您使用的是SQL Server還是Oracle? –

回答

0

下面是可能在甲骨文工作的解決方案:

WITH oldnames AS (
    SELECT 'JohnDoe' AS user_id, 'John' AS fname, 'Doe' AS lname 
     FROM dual 
    UNION 
    SELECT 'JohnDoe1' AS user_id, 'John' AS fname, 'Doe' AS lname FROM dual 
    UNION 
    SELECT 'MaxHeadroom' AS user_id, 'Max' AS fname, 'Headroom' AS lname FROM dual 
), newnames AS (
    SELECT 'John' AS fname, 'Doe' AS lname FROM dual 
    UNION 
    SELECT 'Max' AS fname, 'Headroom' AS lname FROM dual 
    UNION 
    SELECT 'Mark' AS fname, 'Twain' AS lname FROM dual 
) 
SELECT n1.fname, n1.lname, MAX(n2.user_id) 
    , n1.fname || n1.lname || 
     CASE WHEN MAX(n2.user_id) IS NOT NULL THEN TO_CHAR(COALESCE(TO_NUMBER(MAX(REGEXP_SUBSTR(n2.user_id, '\d+$'))), 0) + 1) END 
    FROM newnames n1, oldnames n2 
WHERE n1.fname = n2.fname(+) 
    AND n1.lname = n2.lname(+) 
GROUP BY n1.fname, n1.lname 

在這裏,我假設你有在你存儲的用戶ID與姓和名一起的表。這就是我在上面的查詢中所稱的oldnames,其中newnames是您要爲其生成ID的用戶表。