如何在postgresql中使用CASE和Between in where条件一年

Posted

技术标签:

【中文标题】如何在postgresql中使用CASE和Between in where条件一年【英文标题】:How to use CASE and Between in where condition for a year in postgresql 【发布时间】:2020-09-29 07:26:03 【问题描述】:

我有以下数据

现在如果 oh_year_to 有 Current 这个词,那么我必须将它用作当前年份,如果写有年份,那么它应该考虑写在列上的内容

所以我正在尝试检查以下查询,但它确实给了我错误

SELECT "oh_new_make"
    FROM public.make_override_history 
    CASE 
      WHEN oh_year_to = 'CURRENT' 
       ('2020' BETWEEN "oh_year_from" AND '2020') 
      ELSE
       ('2020' BETWEEN "oh_year_from" AND "oh_year_to") 
    GROUP BY "oh_new_make"

基本上我想要 2020 年的所有 new_makes。这个查询在我传递的值处给了我错误

【问题讨论】:

【参考方案1】:

你可以这样写:

where oh_year_from 
    between '2020' 
    and case when oh_year_to = 'CURRENT' then '2020' else oh_year_to end

你也可以使用布尔逻辑:

where 
    oh_year_from <= '2020' 
    and (oh_year_to = 'CURRENT' or (oh_year_to <> 'CURRENT' and oh_year_to >= '2020')

请注意,此处使用字符串比较相当棘手 - 如果您将 oh_year_to 设置为 3,则条件将成功(因为从字符串角度来看,'3' 大于 '2020')。

【讨论】:

【参考方案2】:

如果我理解正确,你可以使用比较简单的比较逻辑:

where oh_year_from <= '2020' and
      (oh_year_to = 'CURRENT' or oh_year_to <= '2020')

我认为您尝试使用 between 会使逻辑更加复杂。

【讨论】:

以上是关于如何在postgresql中使用CASE和Between in where条件一年的主要内容,如果未能解决你的问题,请参考以下文章

如何在 PostgreSQL、PL/pgSQL 上执行匿名代码块切换 CASE 语句?

POSTGRESQL:使用连接表的案例

将嵌套解码转换为等效的 CASE 语句(需要从 Oracle 转换为 PostgreSQL)

PostgreSQL 错误:CASE 中不允许设置返回函数

case语句返回null postgresql时处理空值

PostgreSQL INSERT INTO SELECT CASE 问题