2012-05-31 66 views
2

我正在做一個像這樣的密碼認證查詢。選擇是否存在其他選擇0是否查詢兩次?

if exists(select UserID from users where [email protected] and [email protected]) 
    select UserID from users where [email protected] and [email protected] 
else 
    select 0 

,但在我看來,我查詢兩次,一個結果 我可以做這個

Select UserID Where Username = @UserName and Password = @Password 

,當我得到我的結果只是檢查閱讀器的結果是多少?

if (!myReader.HasRows) 
    MessageBox.Show("UserName not found or Password invalid"); 
else 
    //do login stuff 

猜猜我在問什麼,哪個更好,還是他們一樣?

+0

有關在數據庫中存儲可重構密碼的標準警告信息。 – Quassnoi

+0

@Quassnoi你會介意解釋這個所謂的標準警告嗎? –

+0

我自己研究過它我認爲這是與Quassnoi談論的內容的一個很好的鏈接,如果您正在閱讀本文並想知道,請檢查一下,它不是一個大的閱讀,但它是一篇優秀的文章http://firelitdesign.blogspot .ca/2011/02/stored-passwords-in-databases.html –

回答

4

使用此:

SELECT ISNULL 
     (
     (
     SELECT userId 
     FROM users 
     WHERE userName = @userName 
       AND password = @password 
     ), 
     0 
     ) 

您與檢查的記錄數將工作太當然的解決方案。

請注意,如果userName不是唯一的並且有@userName的重複項,它將始終返回一個記錄,並且將失敗。

正如@Andriy M所指出的那樣,COALESCE在這裏沒有幫助,因爲它在內部被重寫爲容易出現同樣問題的CASE

回答你的問題:是的,原始批次將訪問users兩次。

+0

我絕對比那第一個更好。我不得不閱讀它,但它選擇非空數據的第一個選項,所以如果第一個選擇不起作用,它會繼續下一個。在這種情況下,它是一個常量,並且始終有效。這非常完美,非常感謝你。 –

+0

使用標量子查詢,[更適合使用'ISNULL'](http://blogs.msdn.com/b/sqltips/archive/2008/06/26/differences-between-isnull-and-coalesce.aspx)而不是'COALESCE'(因爲用'COALESCE'子查詢會執行兩次,這不能解決OP的問題)。 –

+0

@AndriyM:這是一個單獨的子查詢,列表中的第一個。它將被執行一次。 – Quassnoi