简体   繁体   English

Oracle SQL 根据返回值的条件查询到 select 记录

[英]Oracle SQL query to select records based on condition based on returned value

I want to write a query that will return the rows where the validity has ended before the actual end date like the row highlighted in the image我想编写一个查询,该查询将返回在实际结束日期之前有效性已结束的行,如图像中突出显示的行

condition =  end_date < start_date+validity

The WITH clause in the answer is here just to generate some sample data and, as such, it is not a part of the answer.答案中的 WITH 子句在这里只是为了生成一些示例数据,因此,它不是答案的一部分。
I am not sure what is your expected outcome according to your statement (quote) "where the validity has ended before the actual end date" (end quote).根据您的声明(报价)“有效期在实际结束日期之前结束”(结束报价),我不确定您的预期结果是什么。 I would expect that the validity period starts with START_DATE and lasts for next number of months from VALIDITY column.我希望有效期从 START_DATE 开始,并从 VALIDITY 列持续接下来的几个月。 END_DATE looks like arbitrary entered dates that can be within the validation period or outside. END_DATE 看起来像任意输入的日期,可以在验证期内或之外。 The STATUS column describes the rows of data. STATUS 列描述数据行。

WITH
    tbl AS
        (
            Select 1 "ID", To_Date('08.08.2022', 'dd.mm.yyyy') "START_DATE", 12 "VALIDITY", To_Date('08.08.2023', 'dd.mm.yyyy') "END_DATE" From Dual UNION ALL
            Select 2 "ID", To_Date('08.09.2022', 'dd.mm.yyyy') "START_DATE", 24 "VALIDITY", To_Date('08.09.2024', 'dd.mm.yyyy') "END_DATE" From Dual UNION ALL
            Select 3 "ID", To_Date('08.10.2022', 'dd.mm.yyyy') "START_DATE", 36 "VALIDITY", To_Date('12.10.2022', 'dd.mm.yyyy') "END_DATE" From Dual
        )
SELECT
    ID "ID",
    START_DATE "START_DATE",
    VALIDITY "VALIDITY",
    ADD_MONTHS(START_DATE, VALIDITY) "VALIDITY_END_DATE",
    END_DATE "END_DATE",
  CASE 
      WHEN ADD_MONTHS(START_DATE, VALIDITY) > END_DATE THEN 'End date BEFORE the end of validity period'
      WHEN ADD_MONTHS(START_DATE, VALIDITY) < END_DATE THEN 'End date AFTER the end of validity period'
      WHEN ADD_MONTHS(START_DATE, VALIDITY) = END_DATE THEN 'End Date == End Of Validity Period'
  END "STATUS"
FROM
    tbl
--  
--  R e s u l t
--  
--          ID START_DATE   VALIDITY VALIDITY_END_DATE END_DATE  STATUS                                   
--  ---------- ---------- ---------- ----------------- --------- ------------------------------------------
--           1 08-AUG-22          12 08-AUG-23         08-AUG-23 End Date == End Of Validity Period         
--           2 08-SEP-22          24 08-SEP-24         08-SEP-24 End Date == End Of Validity Period         
--           3 08-OCT-22          36 08-OCT-25         12-OCT-22 End date BEFORE the end of validity period

Anyway, the same logic could be implemented even if I got it wrong - in that case - you just need to adjust CASE expression's conditions.无论如何,即使我弄错了,也可以实现相同的逻辑——在这种情况下——你只需要调整 CASE 表达式的条件。 If you don't need the STATUS column it can be excluded and moved to the WHERE clause to filter the data.如果您不需要 STATUS 列,可以将其排除并移至 WHERE 子句以过滤数据。
Your condition from the question问题中的你的条件

 condition =  end_date < start_date+validity   

is in CASE expression stated as在 CASE 表达式中表示为

CASE
...
  WHEN ADD_MONTHS(START_DATE, VALIDITY) > END_DATE THEN 'End date BEFORE the end of validity period'
...

Regards...问候...

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM