示例代码:
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中,有没有更简单的方法来实现此结果?预先感谢
答案 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