我无法弄清楚这个SQL查询是什么

时间:2016-02-06 13:08:13

标签: tsql

declare @loginId nvarchar(50)
set @loginId = null

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

如果我执行该语句,我会获得所有行 但我不明白这里如何处理where条件。

如果@loginId为null,那么where子句不适用或者什么?

3 个答案:

答案 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
  1. 第一行(1)您定义了变量@loginId及其类型
  2. 您为变量NULL
  3. 分配值@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,你可以获得该表中的所有行。

    希望它能帮助您更好地理解它。