SELECT Query должен возвращать записи одного из условий OR в Postgresql - PullRequest
0 голосов
/ 04 ноября 2018

Пример кода:

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 голосов
/ 04 ноября 2018

Вы можете использовать оконные функции, чтобы определить, активна ли какая-либо из строк:

SELECT *
FROM (SELECT f.*,
             BOOL_OR(Active) OVER () as any_active
      FROM Foo f
     ) f
WHERE any_active OR
      (NOT any_active AND DefaultValue); 
0 голосов
/ 04 ноября 2018

Если вы хотите только строки, которые 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...