近日偶爾看到一個很巧妙的 SQL 技巧,一個簡單的 SQL 同時驗證帳號是否存在、密碼是否正確。之前從未曾想過這么做,也未曾見過別人這么做。雖是奇技淫巧,卻真正所謂構思巧妙。如果用來面試考考別人,真的能夠難倒一大片兄弟。好東西不敢獨享,特公開與大家同樂。
1 SELECT CASE WHEN p.encrypted_password =? THEN 1 ELSE 0 END 2 FROM tm_app_user u, tm_app_user_credential p 3 WHERE u.app_user_uuid = p.app_user_uuid 4 AND (LOWER(u.user_sign_in_nm) = ? OR LOWER(u.email) = ?)
解釋:
a. 如果用戶名不存在,則查詢結果是無數據
b. 如果用戶名存在,而密碼不正確,則返回 0
c. 如果用戶名存在,而密碼正確,則返回 1
之所以把密碼單獨用一個表保存,是因為用戶的其他信息(用戶名、郵件、電話)與密碼是兩種不同性質的東西,系統架構師決定分開保存,有助於提醒程序員這種差別: 用戶的其他信息可以查看,密碼不能查看;用戶的其他信息更改時可以看到更改前的數據,密碼更改時不能看到更改前的數據;修改用戶密碼與修改用戶其他信息,是兩個不同頁面。
雖說程序員普遍有“文人相輕”的毛病(讀書人互相瞧不起),但看到這個 SQL,不能不讓人佩服。
我已經將這種技巧,用於我們的折桂單點登錄系統(http://zheguisoft.com)。下一 release 版本將會用上。