【问题标题】:Conditional where clause in Select statementSelect 语句中的条件 where 子句
【发布时间】:2009-06-15 20:02:23
【问题描述】:

我正在使用存储过程根据参数生成报告给 SP。我必须根据传递的参数加入不同的 where 条件。

例如。

ALTER PROCEDURE [dbo].[sp_Report_InventoryAging] 

@TitleFlag int=0, /*0-All veh, 1-Clear Title, 2-Without Clear Title*/

@CompName varchar(100) = 'ALL COMPANIES',

@CompBranchId varchar(50) = 'ALL',  /*All Offices*/

@StateId varchar(50)='All States'       /*All states*/ 

Select .... Where TitleFlag=@TitleFlag and

现在我想根据参数指定条件 -

  1. 如果不是“所有公司”,则 upper(Company)=upper(@CompName)
  2. 如果不是“所有办公室”,则 OfficeID=@CompBranchId
  3. 如果不是“所有州”,则 StateID=@StateID

如何根据参数值在 select 语句的 where 条件中合并所有这些条件?

非常感谢任何帮助。

【问题讨论】:

  • 谢谢 Eric,我已经用过了,但是太费时间了

标签: sql conditional


【解决方案1】:

这样做:

where
(upper(Company)=upper(@CompName) or @compName = 'ALL COMPANIES')
and 
(OfficeID=@CompBranchId or @CompBranchId = 'ALL OFFICES')
and
(StateID=@StateID or @StateID = 'ALL States')

【讨论】:

  • 谢谢,但您似乎没有理解问题所在。如果@compName = 'ALL COMPANIES' 则无需添加条件,如果@StateID = 'ALL States' 则无需添加条件等。
  • @Irfan,我认为您还没有理解解决方案。 :) 如果不使用动态 SQL(不推荐),您不能动态更改 where 子句。您可以做的是确保在传递默认字符串时绕过通常的 where 子句。这就是“OR”的来源。“要么传入默认值,要么公司名称匹配。”在拒绝之前尝试解决方案。
  • 这正是上面建议的代码所做的。如果@compName = 'ALL COMPANIES',那么这将限定每一行。否则,它将评估upper(Company) = upper(@compName)。其他两个参数列也是如此。
  • 是的朋友,你是对的。我得到了解决方案。在拒绝之前,我必须尝试解决方案。对此感到抱歉。再次感谢...
猜你喜欢
  • 2023-03-15
  • 2012-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-07
  • 2018-04-16
相关资源
最近更新 更多