我有一个 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;