SQL Server - 如果变量为null,则返回all

时间:2018-02-04 13:42:48

标签: sql sql-server

当where条件中的变量为null时,我一直在寻找返回所有记录的方法。

我有一个案例,用户有一个可选参数来过滤几个变量(范围),我正在寻找最好的方法,而不影响性能,这是我有多远:

DECLARE @P1 date = '2017-04-16 00:00:00.000',
@P2 nvarchar = null,
@P3 nvarchar = null

Select RefDate,Account,ShortName from JDT1

where RefDate < @P1 AND
Account between isnull(@P2,(select min(account) from JDT1))
and isnull(@P3,(select max(account) from JDT1))

这不会返回表中的所有值+由于两个子查询,运行所需的时间比平常多。

提前致谢。

2 个答案:

答案 0 :(得分:0)

使用参数的伪OR子句

IS NULL现有条件应该可以解决问题:

Select RefDate,Account,ShortName from JDT1
where RefDate < @P1 
AND (Account >= @P2 OR @P2 IS NULL)
AND (Account <= @P3 OR @P3 IS NULL)

答案 1 :(得分:0)

如果您希望它能够正常工作,那么您的代码就可以了。它看起来应该更像:

declare @P1 datetime = '2017-04-16 00:00:00.000',
        @P2 nvarchar(255) = null,
        @P3 nvarchar(255) = null;

Select RefDate, Account, ShortName
from JDT1
where RefDate < @P1 and
      (account >= @P2 or @P2 is null) and
      (account <= @P3 or @P3 is null);

注意:

  • date没有时间组件。如果您不想要时间组件,请使用@P1 date = '2017-04-16'
  • SQL Server根据上下文具有不同的字符类型默认长度。你已宣布单个字符,我怀疑你想要的是什么。
  • 不需要子查询。
  • 在关注性能之前,请正确使用代码。