【问题标题】:How to translate nested CASE expression in order to understand the logic?如何翻译嵌套的 CASE 表达式以理解逻辑?
【发布时间】:2016-12-30 00:59:53
【问题描述】:

我有一个由其他人创建的存储过程。在WHERE 子句中,有一个 CASE 表达式,我很难理解:

 DECLARE
        @DateFrom datetime = '01-01-2016',
        @DateTo datetime = '12-31-2016'
        @EffDateFrom datetime = NULL,
        @EffDateTo datetime = NULL, 
    /*    SOME  SELECT statement here   */
WHERE      
             CASE WHEN @EffDateFrom IS NULL THEN 1
                            ELSE CASE WHEN dateDiff(d, '01-01-2016', dbo.tblQuotes.EffectiveDate) >= 0 
                                    AND dateDiff(d, EOMONTH (GETDATE()), dbo.tblQuotes.EffectiveDate) <= 0 Then 1 
                                  else 0 
                                  end
                            END = 1

--------------/* This is where I am confused */--------------------------------

                        AND CASE WHEN @DateFrom IS NULL THEN 1 ELSE
                            CASE WHEN INV.InvoiceDate > INV.EffectiveDate THEN 
                                CASE WHEN dateDiff(d, '01-01-2016', INV.InvoiceDate) >= 0 
                                    AND dateDiff(d, '12-31-2016', INV.InvoiceDate) <= 0 Then 1 else 0 end
                            ELSE
                                CASE WHEN dateDiff(d, '01-01-2016', INV.EffectiveDate) >= 0 
                                    AND dateDiff(d, '12-31-2016', INV.EffectiveDate) <= 0 Then 1 else 0 end
                            END 
                            END = 1

所以我们在这里说的是:

当参数@DateFrom为null时,使用参数@EffDateFrom,对吗?

但如果它不为空,那么 1.检查InvoiceDate是否大于EffectiveDate,如果是-那么 2.检查01-01-2016和InvoiceDate之间的天数是否大于或等于0AND如果12-31-2016和InvoiceDate之间的天数小于或等于0则为1!!什么是1?意味着记录是有效的?记录将在一个表中?对吗?

ELSE 0 表示它不会选择记录,对吗?

在那之后我很困惑。 更新理解(如果正确):

  CASE WHEN @DateFrom IS NULL THEN 1 ELSE

                            CASE WHEN INV.InvoiceDate > INV.EffectiveDate THEN 
-----------------------------/*then check the below conditions and if its 1 then display the record if its 0 then do NOT */
                                        CASE WHEN   dateDiff(d, '01-01-2016', INV.InvoiceDate) >= 0 
                                                    AND dateDiff(d, '12-31-2016', INV.InvoiceDate) <= 0 THEN 1 ELSE 0 
                                        END
----------------------------/* and this statement will only be working  if parameter @EffDateFrom is not null. Correct? */
                            ELSE
                                CASE WHEN dateDiff(d, '01-01-2016', INV.EffectiveDate) >= 0 
                                    AND dateDiff(d, '12-31-2016', INV.EffectiveDate) <= 0 Then 1 else 0 end
                            END 
                            END = 1

【问题讨论】:

    标签: sql-server tsql case datediff


    【解决方案1】:

    这是(你问的部分的)逻辑:

    IF (@DateFrom IS NULL) 
        OR ((INV.InvoiceDate > INV.EffectiveDate) AND (dateDiff(d, '01-01-2016', INV.InvoiceDate) >= 0) AND (dateDiff(d, '12-31-2016', INV.InvoiceDate) <= 0) )
        OR ((INV.InvoiceDate <= INV.EffectiveDate) AND (dateDiff(d, '01-01-2016', INV.EffectiveDate) >= 0) AND (dateDiff(d, '12-31-2016', INV.EffectiveDate) <= 0)) 
        OR ((INV.InvoiceDate IS NULL) AND (dateDiff(d, '01-01-2016', INV.EffectiveDate) >= 0) AND (dateDiff(d, '12-31-2016', INV.EffectiveDate) <= 0))
        OR ((INV.EffectiveDate IS NULL) AND (dateDiff(d, '01-01-2016', INV.EffectiveDate) >= 0) AND (dateDiff(d, '12-31-2016', INV.EffectiveDate) <= 0))
    THEN TRUE
    ELSE FALSE
    

    整个声明:

    IF (@EffDateFrom IS NULL)
        OR ((dateDiff(d, '01-01-2016', dbo.tblQuotes.EffectiveDate) >= 0 )  AND (dateDiff(d, EOMONTH (GETDATE()), dbo.tblQuotes.EffectiveDate) <= 0) )
    THEN TRUE
    ELSE FALSE
    
    AND
    
    IF (@DateFrom IS NULL) 
        OR ((INV.InvoiceDate > INV.EffectiveDate) AND (dateDiff(d, '01-01-2016', INV.InvoiceDate) >= 0) AND (dateDiff(d, '12-31-2016', INV.InvoiceDate) <= 0) )
        OR ((INV.InvoiceDate <= INV.EffectiveDate) AND (dateDiff(d, '01-01-2016', INV.EffectiveDate) >= 0) AND (dateDiff(d, '12-31-2016', INV.EffectiveDate) <= 0)) 
        OR ((INV.InvoiceDate IS NULL) AND (dateDiff(d, '01-01-2016', INV.EffectiveDate) >= 0) AND (dateDiff(d, '12-31-2016', INV.EffectiveDate) <= 0))
        OR ((INV.EffectiveDate IS NULL) AND (dateDiff(d, '01-01-2016', INV.EffectiveDate) >= 0) AND (dateDiff(d, '12-31-2016', INV.EffectiveDate) <= 0))
    THEN TRUE
    ELSE FALSE
    

    【讨论】:

      【解决方案2】:

      如果不使用case语句,你所困惑的部分可以解释为以下内容:

      WHERE 
                @DateFrom IS NULL 
      
      OR   (    @DateFrom IS NOT NULL 
            AND INV.InvoiceDate > INV.EffectiveDate  
            AND dateDiff(d, '01-01-2016', INV.InvoiceDate) >= 0  
            AND dateDiff(d, '12-31-2016', INV.InvoiceDate) <= 0
            )
      
      OR   (    @DateFrom IS NOT NULL 
            AND dateDiff(d, '01-01-2016', INV.EffectiveDate) >= 0 
            AND dateDiff(d, '12-31-2016', INV.EffectiveDate) <= 0 
           )
      

      【讨论】:

      • 啊哈!!知道了!非常感谢#M.Ali
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-05
      • 2014-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-26
      相关资源
      最近更新 更多