【问题标题】:How do you search between two columns using a parameter and a case when statement? SQL Server如何使用参数和 case when 语句在两列之间进行搜索? SQL 服务器
【发布时间】:2010-05-11 09:20:17
【问题描述】:

我想根据参数上的变量在查询或表中的列之间进行搜索,例如

Declare @SelectAll as integer
Set @SelectAll = 1
Declare @Column as integer

Select mt.Column1, mtColumn2 
From MyTable as mt
Where Case When @SelectAll = 1 Then 
           mt.Column1 IN(@Column) and mt.Column2 (' Selecting all")
           When @SelectAll = 1 Then 
           mt.Column2 IN(@Column) and mt.Column1 (' Selecting all")
           End 

此查询的目的是允许用户在他们选择的列之间进行搜索。此外,参数的使用是为了编写报告服务报告。

【问题讨论】:

  • 您之前的任何问题都得到了满意的回答吗?如果是这样,您应该返回他们并开始标记已接受的答案!

标签: sql-server reporting-services reporting


【解决方案1】:

你有多少列?如果不是很多,我会将所有可能的组合硬编码到一个存储过程中,并通过条件逻辑测试IF (@Column = 1) 等选择正确的组合。我认为唯一的选择是使用动态 SQL。尝试创建一个可以完成所有工作的查询最终会遇到问题,在一种情况下重用执行计划会导致在另一种情况下出现性能问题。

【讨论】:

  • 我将无法使用 store procs,因为使用它们违反了我正在工作的公司政策。此外,使用硬编码总是一个坏主意。
  • 列数2和要搜索的值不是常数
  • 听起来很奇怪的公司政策。条件逻辑同样可以很好地存在于 Reporting Services 报表中,尽管由于所有这些逻辑分散在不同的报表中,重构数据库会更加棘手。我不同意你的最后一点。有关出现的问题的示例,请参阅此线程 stackoverflow.com/questions/2788082/…
  • RE:“列数 2 和将被搜索的值不是恒定的”听起来您最好使用动态 SQL 来创建查询。我认为 Reporting Services 需要结果集的一致格式?
  • 对我来说不幸的是,动态 SQL 在组织中也不例外。我想使用条件 where 子句。 IF 布尔表达式 { sql_statement |语句块 } [ ELSE { sql_statement | statement_block } ] 但这意味着我将不得不重复我的 sql_statement
【解决方案2】:

我找到了最适合我的解决方案 通过在 where 子句中添加这个表达式

(@SelectAll = 1 AND mt.Column1 IN(@Column)) 或 (@SelectAll = 2 AND mt.Column2 IN(@Column)) 或 (@SelectAll = 3)

【讨论】:

    猜你喜欢
    • 2012-05-07
    • 2016-07-08
    • 1970-01-01
    • 2021-09-30
    • 1970-01-01
    • 2011-08-27
    • 2021-02-05
    • 2020-03-27
    • 2015-02-11
    相关资源
    最近更新 更多