如何选择一行或另一行

velaa5lx  于 2021-07-24  发布在  Java
关注(0)|答案(4)|浏览(364)

我有一个带有vat列、开始日期和结束日期的表。我有两排。标准条目 0000-00-00 作为开始日期和结束日期,另一行有开始日期 2020-06-01 最后一天呢 2020-12-31 如果今天的日期介于开始日期和结束日期之间,我希望选择第二行的vat,否则选择标准vat 0000-00-00 应选择
这是我的table:

我试过了

SELECT *
FROM taxes
WHERE (CASE WHEN start_date < "2020-06-06"
                AND end_date > "2020-06-06" THEN 1
            ELSE 0
       END) = 1

但我不知道如何表述else的情况,也不知道它是否能像这样工作

5vf7fwbs

5vf7fwbs1#

你可以用 order by 以及 limit 为此:

select t.*
from taxes t
where start_date = '0000-00-00' or
      '2020-06-06' between start_date and end_date
order by start_date desc
limit 1;

其思想是第一个条件得到“default”值。第二个条件得到匹配条件。然后对这两行进行排序,因此匹配条件将是第一行(如果有)。

jchrr9hc

jchrr9hc2#

也许有办法用你建议的“0000-00-00”日期作为起点和终点,但在我看来,如果你单独处理时间跨度,你运行的船会干净得多。e。列出“例外期”前后的日期范围,如:

INSERT INTO vat (startdt,enddt,fullrate,reducedrate) 
       VALUES ('2000-01-01','2020-06-30',.19,.07), -- before
              ('2020-07-01','2020-12-31',.16,.05), -- exception period
              ('2021-01-01','2500-12-31',.19,.07); -- after

select * from vat where now() between startdt and enddt;

通过这种方式,您可以非常清楚地记录哪些费率适用于以下情况。查询本身变得很简单,请参见上文并查看我的演示:https://rextester.com/ylyuu53617

k0pti3hp

k0pti3hp3#

SELECT * 
FROM taxes 
WHERE tax_id=IF(start_date < "2020-06-06" AND end_date > "2020-06-06", 1, 0)
o7jaxewo

o7jaxewo4#

您可以找到当前日期的记录,然后将此集合与按“0000-00-00”筛选的源表合并,不包括此集合中的国家代码

with 
 current_taxes as (
    select *
    from taxes 
    where current_date between start_date and end_date 
)
select *
from current_taxes
union all 
select *
from taxes 
left join current_taxes
using (country_code)
where taxes.start_date='0000-00-00'
and current_taxes.country_code is null
;

相关问题