我有一个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'
)为true,则不评估下一个条件。
我只需要选择第二行(| 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;
我想知道这个工作是否还有其他优雅的查询?
答案 0 :(得分:0)
这能给您想要的东西吗?
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;
答案 1 :(得分:0)
您在一个地方说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;