[英]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.