【问题标题】:condition in where clause with optional parameter带有可选参数的 where 子句中的条件
【发布时间】:2013-04-09 05:31:36
【问题描述】:

我的存储过程中有你的输入参数。例如,

DECLARE @fromDate DateTime = NULL 
DECLARE @toDate DateTime = NULL
DECLARE @Id int = NULL

我想在 where 子句中写一个条件,例如...如果提供了 fromDate,则必须在 @fromDate 上进行搜索。如果未提供@fromDate,则检查@Id 变量,如果它不为空,则根据@Id 搜索...

类似...

 where 
   CASE 
   when @fromDate is not null
  THEN (@FromDate is null or ([Created] between @FromDate and @ToDate))
    ELSE (@requestId is null or Id=@requestId)

以下解决方案存在一个问题...如果同时提供了@fromDate 和@Id,那么这将对它们进行检测,并且没有任何返回.....条件应该是...如果给出了@fromDate即使提供了@Id 并且结果不能依赖于@Id 参数,也会优先考虑@fromDate....

【问题讨论】:

  • 为什么要支持传递非空@fromDate@Id的能力,然后忽略其中之一?如果我正在调用您的过程并为它们两个传递值,我当然不会期望它会按照您的描述进行。
  • 总之,寻找这种东西的通常地方是 Erland Sommarskog 的Dynamic search conditions in T-SQL

标签: sql sql-server-2008 stored-procedures


【解决方案1】:

因为您依赖于这两个参数,所以您可以在以下条件下使用它们both

where
(@FromDate is null or ([Created] between @FromDate and @ToDate)) 
or
((@requestId is null or Id=@requestId) 
    and @FromDate is null) ----mix @requestId & @FromDate

【讨论】:

    【解决方案2】:

    你是这个意思吗?请检查:

    WHERE [Created] BETWEEN 
        (CASE WHEN @FromDate IS NOT NULL THEN @FromDate ELSE [Created] END) AND
        (CASE WHEN @ToDate IS NOT NULL THEN @ToDate ELSE [Created] END) AND
        Id=(CASE WHEN @requestId IS NOT NULL THEN @requestId ELSE Id END)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-03
      • 1970-01-01
      相关资源
      最近更新 更多