PSQL выберите либо a или b по порядку, но не оба a и b, если существуют оба a и b - PullRequest
1 голос
/ 29 мая 2019

У меня есть таблица PSQL

+--------+------+------+------+
|  Col1  | Col2 | Col3 | Col4 |
+--------+------+------+------+
|    001 | 00A  | 00B  | 001  |
| 001001 | 00A  | 00B  | 001  |
|    002 | 00X  | 00Y  | 002  |
| 002002 | 00X  | 00Y  | 002  |
+--------+------+------+------+

У меня следующий запрос PSQL:

select *
from my_table
where (Col1 = '001' or Col4 = '001')
  and Col2 = '00A'
order by Col3 asc; 

Я получаю первые два ряда.

Здесь происходит то, что оно соответствует обоим условиям для условия OR. Мне нужно соответствовать только одному из or условий. То есть, если первое условие (Col1='001001') истинно, тогда не оценивает следующее условие. Мне нужно выбрать только 2-й ряд (| 001001 | 00A | 00B | 001 |)

Я создал другой запрос, используя EXCEPT

select *
from my_table
where (Col1 = '001' or Col4 = '001')
  and Col2 = '00A'
    except (select *
            from my_table
            where Col1 != '001'
              and Col2 = '00A')
order by Col3 asc
limit 1;

Хотелось бы узнать, есть ли другие элегантные запросы для этой работы?

Ответы [ 2 ]

0 голосов
/ 29 мая 2019

Ваше объяснение сбивает с толку, когда вы говорите col1 = '001001' в одном месте и используете 001 в запросе. Но я предполагаю, что вы хотите использовать иерархию сравнения и вернуть ту, которая имеет наибольшее значение для каждой группы (col2,col3,col4). Используйте DISTINCT ON. Измените условие так, как хотите, чтобы вернуть соответствующую строку.

SELECT DISTINCT ON (col2, col3, col4) * 
  FROM     my_table WHERE  col2 = '00A' 
ORDER  BY col2, 
          col3, 
          col4, 
          CASE 
            WHEN col1 = '001001' THEN 1 
            WHEN col4 = '001'    THEN 2 
          END; 

DEMO

0 голосов
/ 29 мая 2019

Это дает вам то, что вы хотите?

select *
from my_table
where (Col1 = '001' and Col2 != '00A')
    or ((Col1 is null or Col1 = '') and Col4 = '001' and Col2 = '00A')
order by Col3 asc;
...