2014-01-24 28 views
2

请求为2部分:如何在WHERE子句中编写条件?

  1. 记录应脱落报告_ * 如果记录已过期, 如果* _ RecordStatus != 'Funded'

  2. 记录应留在报告 _ 如果RecordStatus = 'Funded' * ,没有*PURCHASEDATE,如果记录已过期(在过去是从** currentdate)。

我试过这样做CASE但这个请求似乎是布尔逻辑,因此,不切实际。我试图寻找到IF...THEN...ELSE,但我失去了如何做到这一点。我花了整整两天的时间试图让这个工作,我什么都没有得到。有没有人帮助过我,然后解释它?

下面是失败的一个简单的例子(是的,我完全理解这种失败,因为一个条件,不是表达式):

Select distinct ... 
from ... --with joins 
where ... 
and case when RecordStatus != 'Funded' then getdate() <= EXPIRATIONDATE else ?? end 

谢谢!!

+0

所以,你有'RecordStatus'具有'资金'或其他的状态,你有'PurchaseDate'有一个日期或'null'的值。过期日期是一列还是您在查询中提供的参数? –

+2

在你的条件的where子句中使用'AND'&'OR'。 –

回答

3

的要求似乎犯罪嫌疑人给我,但这里是它我的观点(没有“条件逻辑”需要),以及为什么它似乎是“可疑的”,如果我正确地读它..

记录应保留在报告上如果RecordStatus ='已资助',没有购买,并且记录已过期(从当前日期起过去)。

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

记录应脱落的报告。如果该记录已过期,如果RECORDSTATUS!= '资助'。

NOT (HasExpired AND RecordStatus <> 'Funded') 

组合:

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

随着德·摩根的转型:分配后

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 

然而,假设HasExpired相同ExpiredDate < CURRENT_TIMESTAMP

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

这当然是不正确的,为什么我是犯罪嫌疑人。

+0

由于OP在WHERE条款方面存在问题,我怀疑DMT可能有点高级 - 但详细信息为 – Basic

+1

感谢您的帮助!我肯定会让这个问题变得复杂,在阅读你的评论后,3天的周末肯定会有所帮助。我不知道DMT,所以我研究它,这绝对是有益的。现在一切都很好,生意兴隆! – user3229496

2

你目前的标准有点误导。

你是说在一种情况下,它应该脱离报告,在另一种情况下,它应该保持不变,但你指的是不同的状态。

我喜欢想到我想在SQL查询中看到的东西。

所以我想看到资助状态,我想看看null的PurchaseDate的。

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

如果你也想看看RECORDSTATUS的记录!=“资助”,但只有当该记录是当前再添加一个OR

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

通常你建立在一个你的逻辑和而避免使用CASE或者如果不是性能明智

... 
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