【问题标题】:How to write conditions in a WHERE clause?如何在 WHERE 子句中编写条件?
【发布时间】:2023-03-18 18:22:01
【问题描述】:

请求分为两部分:

  1. 记录应该从报告中脱落 _*如果记录已过期并且 如果 *_RecordStatus != 'Funded'.

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

我尝试使用CASE 执行此操作,但此请求似乎是布尔逻辑,因此不切实际。我试图调查IF...THEN...ELSE,但我不知道该怎么做。我花了整整 2 天的时间试图让它发挥作用,但我一无所获。有没有人可以帮我解决这个问题然后解释一下?

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

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

谢谢!!

【问题讨论】:

  • 所以,RecordStatus 的状态为 Funded 或其他值,PurchaseDate 的值为日期或 null。到期日期是一列还是您在查询中提供的参数?
  • 根据条件在 where 子句中使用 ANDOR

标签: sql sql-server conditional-statements where


【解决方案1】:

你目前的标准有点误导。

您是说在一种情况下它应该从报告中脱落,而在另一种情况下它应该继续存在,但您指的是不同的状态。

我喜欢思考我想在 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】:

    通常你在 WHERE 中构建你的逻辑,而不是使用 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
    

    【讨论】:

      【解决方案3】:

      这些要求对我来说似乎很可疑,但这是我的看法(不需要“条件逻辑”)以及为什么它看起来“可疑”,如果我没看错的话..

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

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

      如果记录已过期且 RecordStatus != 'Funded',则记录应从报告中删除。

      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
      

      但是,假设HasExpiredExpiredDate &lt; CURRENT_TIMESTAMP 相同

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

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

      【讨论】:

      • 由于 OP 在 WHERE 子句方面存在问题,我怀疑 DMT 可能有点先进 - 但详细信息 +1
      • 感谢您的帮助!在阅读了您的 cmets 之后,我肯定让这件事变得复杂了,一个为期 3 天的周末肯定会有所帮助。我不知道 DMT,所以我研究了一下,它绝对是有益的。现在一切都很好,企业很高兴!
      猜你喜欢
      • 2022-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-11
      • 2019-08-01
      • 2022-08-08
      • 2019-02-03
      相关资源
      最近更新 更多