PSQL 按顺序选择 a 或 b,但如果 a 和 b 都存在,则不要同时选择 a 和 b



我有一个 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'(为真,则不计算下一个条件。我只需要选择第二行(| 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;

我想知道这份工作是否还有其他优雅的查询?

当您在一个地方说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; 

演示

这能给你你想要的吗?

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;

相关内容

  • 没有找到相关文章

最新更新