簡體   English   中英

SQL在什么情況下

[英]where case when sql

我有一張銷售桌

如果最高日期SalePeriodFrom = 20181101,我希望執行以下操作選擇可用的數據日期

(如果頂部值SalePeriodFrom 2018年1月11日 -本月數據的第一個可用)

如果不使用前一天的數據(前一個月的最后一天31/10/2018)

我的代碼是

Select *
from Sales

Where case when SalePeriodFrom > DATEADD(m, DATEDIFF(m, 0, GETDATE()), 0) then   

  (SalePeriodFrom  <= DATEADD(m, DATEDIFF(m, 0, GETDATE()), 0)
  and (SalePeriodTo > '20010101' or
  SalePeriodTo is null))

   else (SalePeriodFrom <= DATEADD(DAY, -(DAY(GETDATE())), GETDATE())
  and (SalePeriodTo > '20010101' or
  SalePeriodTo is null)) end 

我似乎無法解決這個問題,請提出任何建議

這似乎是在復制CASE表達式中包含的布爾表達式,但是,如果沒有示例數據,我將無法進行檢查:

SELECT {List of Columns} --You should probably list your columns here
FROM dbo.Sales --Assumed dbo schema
WHERE (SalePeriodFrom > DATEADD(m, DATEDIFF(m, 0, GETDATE()), 0)
  AND  (SalePeriodTo > '20181101' OR SalePeriodTo IS NULL))
   OR (SalePeriodFrom <= DATEADD(DAY, -(DAY(GETDATE())), GETDATE())
  AND (SalePeriodTo > '20010101' OR SalePeriodTo IS NULL));

就像在問題注釋中提到的那樣,它根本不使用CASE表達式。 在您的列上使用CASE會導致查詢變得無法SARG,因此(通常)最好避免使用它們。

注意我取出了子句SalePeriodFrom <= DATEADD(m, DATEDIFF(m, 0, GETDATE()), 0) 這實際上沒有任何意義,因為您似乎正在嘗試檢查SalePeriodFrom的值SalePeriodFrom大於( > )且小於或等於( <= )表達式DATEADD(m, DATEDIFF(m, 0, GETDATE()), 0) 某事物大於某事物小於或等於它是不可能的。 例如1大於0但不等於或小於0 0小於或等於0 ,但不大於0

如上所述,第一個WHEN條件始終為false,因此您可以將其丟棄。

SELECT * FROM Sales
WHERE SalePeriodFrom <= DATEADD(m, DATEDIFF(m, 0, GETDATE()), 0) AND
      (SalePeriodFrom <= DATEADD(DAY, -(DAY(GETDATE())), GETDATE()) AND 
      (SalePeriodTo > '20010101' OR SalePeriodTo is null))

您的問題邏輯確實很亂,很難理解。 重新讀給自己聽,或大聲朗讀給同事,看看他們是否了解您的情況

我對您的要求的理解是:

如果sales表包含2018年11月01日的任何數據,請返回日期為2018年11月1日的所有數據,否則返回日期為2018年10月31日的任何數據

select *
from sales
where SalePeriodFrom = 
    (SELECT MAX(saleperiodfrom) FROM sales WHERE saleperiodfrom IN ('2018-11-01', '2018-10-30'))

如果兩個日期或僅11月1日都有數據,則MAX()將返回11月1日。 如果從11月1日起沒有數據,但是從10月30日起有數據,則MAX將返回10月30日。 如果兩個日期都沒有數據,則最大值將不返回任何內容,並且您將不會獲得任何數據

如果我誤解了您的要求,請更清楚地說明

——————————————————————————————

編輯:

也許您的意思是:

如果sales表包含日期為2018年11月1日的任何數據,則在2018年11月1日午夜之后返回所有數據,否則在2018年10月31日午夜之后返回所有數據

select *
from sales
where SalePeriodFrom >= 
    (SELECT MAX(saleperiodfrom) FROM sales WHERE saleperiodfrom IN ('2018-11-01', '2018-10-30'))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM