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?
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?
讓我在這裏補充我的兩分錢。我將嘗試逐行解釋你的代碼。它是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
@loginId
和其類型的第一行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
,您可以在該表中找到所有行。
希望它能幫助你更好地理解它。
好了,代碼首先將變量@loginId
到null
,後來where
接受一些條件或@loginId is null
所有行,所以你有它...
「如果@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)
使用這種模式時要小心;它通常不會導致最佳的計劃。在這種情況下,開發人員習慣於像這樣編寫SQL,儘管他們總是提供一個參數,因爲它使得代碼更加「可擴展」。 –
「or @loginid是null」的哪部分你不明白嗎?查詢邏輯看起來很清楚。 –
這只是關於邏輯嘗試讀這個:'LoginId = @loginId >>>>>>>>>>>>>>>>>>>或<<<<<<<<<<<<<<< @loginId爲null',並且在數據庫中'@loginId爲null'與詢問「是否這個變量等於null?「 –
你應該將它標記爲'tsql',因爲這不是普通的SQL(所有的SQL方言都不支持這樣的變量) – Lucero