条件WHERE基于SQL Server参数值

时间:2014-07-14 21:57:23

标签: sql sql-server sql-server-2008

我正在修改SQL Server中的现有存储过程并尝试提出一个应该采用条件WHERE的查询,具体取决于其中一个输入参数是null还是有值。< / p>

存储过程需要三个输入参数

@FromDate
@ToDate
@PersonnelNo

@FromDate@ToDate将始终具有值,并且将成为WHERE条件的一部分,但@PersonnelNo可以为null或可以保留值。

@PersonnelNo为空时,我希望所有用户都在给定@FromDate@ToDate日期,但当参数@PersonnelNo有值时,我希望存储过程为仅返回该用户的数据。

我尝试了以下两种方法,但只有在@PersonnelNo输入值时才能正常工作(正确提供一个用户记录)。如果我将@PersonnelNo作为null输入,则不会返回任何记录,而是我想要所有用户。

我想知道我哪里出错了,或者根据我目前采用的方法是否可行?

SELECT  FirstName,
        LastName,
        PersonnelNum,
        RecCreatedOn
FROM    [test].Person
WHERE   RecCreatedOn BETWEEN @FromDate AND @ToDate
        AND (
         (ISNULL(@PersonnelNo, 0) != 0 AND PersonnelNum = @PersonnelNo)
        )

和一个略有不同的WHERE子句

WHERE   RecCreatedOn BETWEEN @FromDate AND @ToDate
        AND ((@PersonnelNo IS NOT NULL) AND PersonnelNum = @PersonnelNo)

1 个答案:

答案 0 :(得分:4)

这可以说,如果@PersonnelNo为null,则用PeronnelNum替换它。 PersonnelNum将始终等于PersonnelNum,因此如果@PersonnelNo为null,则此条件将始终为true。

SELECT  FirstName,
        LastName,
        PersonnelNum,
        RecCreatedOn
FROM    [test].Person
WHERE   RecCreatedOn BETWEEN @FromDate AND @ToDate
AND     (@PersonnelNo is null or PersonnelNum = @PersonnelNo)

您先前尝试的说明:

ISNULL(@PersonnelNo, 0) != 0 AND PersonnelNum = @PersonnelNo

如果@PersonnelNo为null,则变为:

  • 0 != 0 and PersonnelNum = 0
  • 这变为false and false
  • 变为false
  • 因此不会返回任何行

如果@PersonnelNo是(例如)1则变为:

  • 1 != 0 and PersonnelNum = 1
  • 这变为true and true (for the row where PersonnelNum is 1)
  • 变为true
  • 所以你会看到第1个人的行。

    (@ PersonnelNo IS NOT NULL)AND PersonnelNum = @PersonnelNo

如果@PersonnelNo为null,则变为:

  • (null is not null) and PersonnelNum = null
  • 这变为false and false
  • 变为false
  • 因此不会返回任何行

如果@PersonnelNo是(例如)1则变为:

  • 1 is not null and PersonnelNum = 1
  • 这变为true and true (for the row where PersonnelNum is 1)
  • 变为true
  • 所以你会看到第1行的行。

有效的方法:

  • PersonnelNum = coalesce(@PersonnelNo,PersonnelNum)
  • (@PersonnelNo is null or PersonnelNum = @PersonnelNo)

虽然上述方法之间存在细微差别。如果PersonnelNum可以为空,则可能会得到不同的结果;即coalesce方法不包括此列中具有空值的行,而第二种方法将包含空值。