【问题标题】:Dynamic Case Expression Based on Dates基于日期的动态案例表达
【发布时间】:2021-06-22 18:32:43
【问题描述】:

我有一个 SQL 查询,它有多个条件会改变 WHERE 子句。我有三个动态更新此 WHERE 子句的 case 表达式。最后两个 case 表达式运行良好。但是,第一个比后两个更有活力,我遇到了问题。

这是适用于本练习的表格部分 (Image of Table)

我需要它按如下方式工作: 当我的变量@selection = 1 时,我需要它根据传入的两个日期对我的回报进行排序。 当我的变量 @selection = {any other int} 时,我需要它返回所有日期。

带有描述的查询
...
在哪里
{开始日期} =(@selection = 1 时的情况,然后 {返回开始日期在传入的两个日期之间的所有值} else {返回所有开始日期})
...

整个查询

DECLARE @selection integer ;
DECLARE @items integer ;
DECLARE @washTypes integer ;

SET @selection = {Root Container.Selection Group.Selection Checkbox.controlValue} ;
SET @items = {Root Container.Items Group.Items Checkbox.controlValue} ;
SET @washTypes = {Root Container.Types of Wash Group.Wash Types Checkbox.controlValue} ;

SELECT

RAW_CIP_records_ndx as 'Index', 
start as 'Start', 
stop as 'End', 
total_duration as 'Total Duration', 
item as 'Item', 
wash_type as 'Type of Wash', 
operator as 'CIP Operator', 
program_complete as 'Program Fully Completed?'

FROM RAW_CIP_records

WHERE
start = (case when @selection = 1 then (BETWEEN '{Root Container.Start Date.formattedDate}' and '{Root Container.End Date.formattedDate}') else start end)
and 
item = (case when @items = 0 then 'Receiving Bay 1' when @items = 1 then 'Receiving Bay 2' when @items = 2 then 'Receiving Bay 3' else item end)
and
wash_type = (case when @washTypes = 0 then 'Regular' when @washTypes = 1 then 'Sanitize' when @washTypes = 2 then 'Acid' else wash_type end)

我可以获得一个简单的 WHERE 子句来处理这两个日期和 BETWEEN 函数。但是,我不知道如何将所有这些传递到 CASE 表达式中。

【问题讨论】:

  • 我不确定我是否真的理解这个问题,但这是您需要的吗? WHERE (case when @selection = 1 then (start BETWEEN '{Root Container.Start Date.formattedDate}' and '{Root Container.End Date.formattedDate}') else 1=1 end)
  • 我试过这个:WHERE(@selection = 1 时的情况,然后(开始 BETWEEN '{Root Container.Start Date.formattedDate}' 和 '{Root Container.End Date.formattedDate}') else start = start end) 但它给了我一个错误,提示“键 'BETWEEN' 附近的语法不正确。
  • 尝试像使用 @selection 一样在变量中声明 {Root Container.Start Date.formattedDate} 并在查询中使用它们
  • This answer 显示了如何在 on(或 where)子句中使用 case。现在阅读 David Browne 提供的 Sommarskog 文章链接。

标签: sql sql-server tsql case where-clause


【解决方案1】:

您可以在一个查询中使用WHERE 条件

WHERE (
     @selection = 1 AND (start BETWEEN @startDate and @endDate)
  OR @selection <> 1
)

但我建议您最好使用两个单独的查询,因为它更有可能使用索引。

IF @selection = 1
    SELECT ...
ELSE
    SELECT ...

【讨论】:

    【解决方案2】:

    可能是这样的:

    WHERE
    1 = (case when @selection = 1 then 
                case when start BETWEEN '{Root Container.Start Date.formattedDate}' and '{Root Container.End Date.formattedDate}' then 1 else 0 end
            else 1
         end)
    and
    item = ...
    

    警告:这很可能不会使用任何索引,因此请仅在您的情况可以接受的情况下使用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-08-11
      • 1970-01-01
      • 1970-01-01
      • 2023-03-18
      • 2017-05-26
      • 2019-05-11
      • 1970-01-01
      相关资源
      最近更新 更多