如何在WHERE子句中编写条件?

时间:2014-01-24 20:37:27

标签: sql sql-server conditional-statements where

请求是2部分:

  1. 记录应该从报告中删除_ * 如果记录已过期AND if * _ RecordStatus != 'Funded'

  2. 记录应保留在报告中 _ 如果 RecordStatus = 'Funded' * ,则没有* PURCHASEDATE,并且记录已过期(过去是** {{1} })。

  3. 我尝试用currentdate做这个,但是这个请求似乎是布尔逻辑,因此不切实际。我试图调查CASE,但我失去了如何做到这一点。我花了整整两天的时间试图让这个工作起来,我什么也没做到。那里有没有人帮我解决这个问题然后解释一下?

    下面是一个简单的失败示例(是的,我完全理解这是由于条件而不是表达式而失败):

    IF...THEN...ELSE

    谢谢!

3 个答案:

答案 0 :(得分:3)

这些要求似乎对我很怀疑,但这是我对它的看法(没有"条件逻辑"需要)以及为什么看起来如此可疑"如果我正在阅读它正确..

  

记录应保留在报告中如果RecordStatus ='资助',没有PURCHASEDATE,并且记录已过期(过去是从当前日期开始)。

RecordStatus = 'Funded'
AND PurchaseDate IS NULL
AND ExpiredDate < CURRENT_TIMESTAMP
  

如果记录已过期且RecordStatus!=&#39;资助&#39;

,记录应该从报告中删除
NOT (HasExpired AND RecordStatus <> 'Funded')

组合:

RecordStatus = 'Funded'
AND PurchaseDate IS NULL
AND ExpiredDate < CURRENT_TIMESTAMP
AND NOT (HasExpired AND RecordStatus <> 'Funded')

De Morgan的转型:

RecordStatus = 'Funded'
AND PurchaseDate IS NULL
AND ExpiredDate < CURRENT_TIMESTAMP
AND (NOT HasExpired OR RecordStatus = 'Funded')

分发后消除包含的条件。

RecordStatus = 'Funded'
AND PurchaseDate IS NULL
AND ExpiredDate < CURRENT_TIMESTAMP
AND NOT HasExpired

但是,假设HasExpiredExpiredDate < CURRENT_TIMESTAMP

相同
RecordStatus = 'Funded'
AND PurchaseDate IS NULL
AND ExpiredDate < CURRENT_TIMESTAMP
AND NOT ExpiredDate < CURRENT_TIMESTAMP

当然,这绝不是真的,为什么我会怀疑。

答案 1 :(得分:2)

您目前的标准有点误导。

你说在一个案例中它应该从报告中删除,而在另一个案例中它应该继续,但你指的是不同的状态'。

我喜欢考虑我想在SQL查询中看到的内容。

所以我希望看到Funded状态,我希望看到PurchaseDate为null。

SELECT ...
FROM ...
WHERE (RecordStatus = 'Funded' AND purchaseDate IS NULL) 

如果您还想查看RecordStatus!='Funded'的记录,但仅当记录是最新的时候才添加OR

WHERE (RecordStatus = 'Funded' AND purchaseDate IS NULL) OR
      (RecordStatus != 'Funded' AND getDate() <= ExpirationDate)

答案 2 :(得分:0)

通常,您在WHERE中构建逻辑,而不是使用CASE或IF,这不是性能明智的

...  
NOT (RecordStatus != 'Funded' AND getdate() > EXPIRATIONDATE) OR
(PURCHASEDATE IS NULL AND RecordStatus = 'Funded' AND getdate() > EXPIRATIONDATE)

您可以进一步优化它:

...
RecordStatus = 'Funded' OR getdate() <= EXPIRATIONDATE OR
PURCHASEDATE IS NULL