declare @loginId nvarchar(50)
set @loginId = null
select * from loginusers where LoginId = @loginId or @loginId is null
如果我执行该语句,我会获得所有行 但我不明白这里如何处理where条件。
如果@loginId
为null,那么where子句不适用或者什么?
答案 0 :(得分:0)
好吧,代码首先将变量Test()
设置为@loginId
,稍后null
接受所有具有某些条件的行或 where
,所以你有它......
答案 1 :(得分:0)
"如果@loginId为null,则where子句不适用"
是的,这就是它的作用。我对具有多个参数的存储过程使用了类似的方法,其中一个或多个参数可能具有NULL值(根据经验,我尝试坚持小于5,否则它将成为动态SQL的候选者)。 / p>
例如:
SELECT
*
FROM
LoginUsers
WHERE
(@Username IS NULL OR LoginUsers.Username = @Username)
AND (@LoginID IS NULL OR LoginUsers.LoginID = @LoginID)
答案 2 :(得分: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
@loginId
及其类型NULL
@loginId
的第二行(请记住,这很重要)
醇>
然后在你的查询中,WHERE
子句真正重要的是你使用LoginId = @loginId OR @loginId is null
你在这里问的是:
我的表格字段LoginId
是否等于我定义的变量@loginId
还是等于NULL
在这里你必须记住逻辑表OR
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
,你可以获得该表中的所有行。
希望它能帮助您更好地理解它。