SELECT查询应返回Postgresql中OR条件之一的记录

时间:2018-11-04 10:59:39

标签: sql postgresql

示例代码:

CREATE TABLE Foo
(
    Id SERIAL NOT NULL,
    Name TEXT NOT NULL,
    DefaultValue BOOLEAN NOT NULL,
    Active BOOLEAN NOT NULL
);

INSERT INTO Foo(Name, DefaultValue, Active)
VALUES ('aa', TRUE, FALSE);
INSERT INTO Foo(Name, DefaultValue, Active)
VALUES ('bb', TRUE, FALSE);

我需要与此类似的查询才能获得所需的结果:

SELECT *
FROM Foo 
WHERE Active = TRUE OR DefaultValue = TRUE;

查询应返回aa,bb的记录。

添加这两个记录后:

INSERT INTO Foo(Name, DefaultValue, Active)
VALUES ('cc', FALSE, TRUE);
INSERT INTO Foo(Name, DefaultValue, Active)
VALUES ('dd', FALSE, TRUE);

查询应返回cc,dd的记录。

如果存在,我只需要第一个条件的记录。否则我想要第二个条件的记录。

在postgresql中,有没有更简单的方法来实现此结果?预先感谢

2 个答案:

答案 0 :(得分:2)

您可以使用窗口函数来确定是否有任何行处于活动状态:

SELECT *
FROM (SELECT f.*,
             BOOL_OR(Active) OVER () as any_active
      FROM Foo f
     ) f
WHERE any_active OR
      (NOT any_active AND DefaultValue); 

答案 1 :(得分:1)

如果只希望有active 行,如果至少有active的一行,否则为默认行,那么下面的行就足够了:

with by_precedence as (
select
*
, case when Active = True then 0
       when defaultValue = True then 1
       else 2
  end as precedence
from foo
)
select *
from by_precedence b
where b.precedence in (select min(precedence) from by_precedence)
order by precedence

否则,您能否编辑您的问题并添加以上示例无法满足您需要的示例?

id  name    defaultvalue    active  precedence
3   cc      f               t       0
4   dd      f               t       0

SQL Fiddle