2016-02-06 73 views
0
declare @loginId nvarchar(50) 
set @loginId = null 

select * from loginusers where LoginId = @loginId or @loginId is null 

如果我執行該語句,我得到所有的行 但我不明白如何在這裏處理where條件。我不知道這個SQL查詢是什麼

if @loginId is null then where clause does not apply or what?

+1

「or @loginid是null」的哪部分你不明白嗎?查詢邏輯看起來很清楚。 –

+0

這只是關於邏輯嘗試讀這個:'LoginId = @loginId >>>>>>>>>>>>>>>>>>>或<<<<<<<<<<<<<<< @loginId爲null',並且在數據庫中'@loginId爲null'與詢問「是否這個變量等於null?「 –

+0

你應該將它標記爲'tsql',因爲這不是普通的SQL(所有的SQL方言都不支持這樣的變量) – Lucero

回答

0

讓我在這裏補充我的兩分錢。我將嘗試逐行解釋你的代碼。它是TSQL所以它將以程序方式處理。

您有:

1- declare @loginId nvarchar(50) 
2- set @loginId = null 
3- 
4- select * 
5- from loginusers 
6- where LoginId = @loginId 
7-  OR @loginId is null 
  1. (1)所定義的變量@loginId和其類型的第一行
  2. 第二行(記住ONE,這將是重要的),你的值指定爲NULL到您的變量@loginId

然後在您的查詢,什麼是真正重要的它WHERE條款,並使用LoginId = @loginId OR @loginId is null你問這裏是:

是我的表中的字段LoginId等於我定義的變量@loginId還是等於NULL

在這裏,你必須記住的邏輯表或

A | B | Result (A OR B) 
0 0   0 
1 0   1 
0 1   1 
1 1   1 

那麼,記得當我說分配的價值很重要嗎?在這裏,你的數據庫字段LoginId很可能不會有空值,你的變量(如果在分配和查詢之間有任何代碼)將始終爲NULL,因此在邏輯表中它將是0 or 1 = TRUE,因此你的where條件將始終是TRUE,您可以在該表中找到所有行。

希望它能幫助你更好地理解它。

0

好了,代碼首先將變量@loginIdnull,後來where接受一些條件@loginId is null所有行,所以你有它...

0

「如果@loginId爲null,則where子句不適用「

是的,就是這樣做。我用一個類似的方法來存儲有多個參數的存儲過程,其中一個或多個參數可能有一個NULL值(我試圖堅持小於5作爲一個經驗法則,否則它將成爲動態SQL的替代品)。

例如:

SELECT 
    * 
FROM 
    LoginUsers 
WHERE 
    (@Username IS NULL OR LoginUsers.Username = @Username) 
    AND (@LoginID IS NULL OR LoginUsers.LoginID = @LoginID) 
+0

使用這種模式時要小心;它通常不會導致最佳的計劃。在這種情況下,開發人員習慣於像這樣編寫SQL,儘管他們總是提供一個參數,因爲它使得代碼更加「可擴展」。 –

相關問題