Фильтровать строки в таблице PostgreSQL на основе условий соответствия столбца - PullRequest
1 голос
/ 13 июля 2020

У меня есть следующая таблица в PostgreSQL 11.0

col1    col2      col3      col4
1       a         a         a          
1       a         a         a_1
1       a         a         a_2
1       b         b         c
2       d         d         c
3       e         d         e

Я хотел бы отфильтровать приведенную выше таблицу так, чтобы, если col2 и col4 равны, должно быть выбрано только это совпадение, а две строки ниже исключены. Если col2 и col4 не равны, строки с col2 = col3 должны быть сохранены.

Желаемый результат:

col1    col2      col3      col4
1       a         a         a          
1       b         b         c
2       d         d         c
3       e         d         e

Я пытаюсь выполнить следующий запрос, но пока безуспешно.

select * from table1
where col2=col4
union
select * from table1
where col2 !=  col4 and col2=col3 

, но это будет включать строки, в которых уже есть совпадения, которые я хочу исключить из окончательного вывода.

1       a         a         a_1
1       a         a         a_2

Ответы [ 2 ]

1 голос
/ 13 июля 2020

Я бы использовал

SELECT DISTINCT ON (col2) *
FROM table1
WHERE col2 = col4 OR col2 = col3
ORDER BY col2, col2 IS DISTINCT FROM col4;

Это зависит от FALSE < TRUE.

0 голосов
/ 13 июля 2020

Насколько я понимаю, вам нужен уникальный col2 результат с заданными условиями:

Попробуйте следующее:

with cte as 
(select *, 
 case 
 when col2=col4 then 2 
 when col2=col3 then 1 
 else 0 
 end "flag" from table1 )
 
 select distinct on(col2) col1,col2,col3,col4 from cte where flag>0
order by col2, "flag" desc

Демо на Fiddle

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