【问题标题】:PSQL select either a or b in order but not both a and b if both a and b existsPSQL 按顺序选择 a 或 b,但如果 a 和 b 都存在,则不要同时选择 a 和 b
【发布时间】:2019-05-29 06:05:18
【问题描述】:

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

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

【问题讨论】:

  • 用例条件
  • @NidhinDavid 。 . .我真的很困惑。条件 Col1='001001' 不在您的查询中。即使你解决了这个问题,我仍然对你想要什么感到困惑。你总是想要一排吗?如果更多行符合您的条件怎么办?

标签: sql database postgresql psql logical-operators


【解决方案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; 

DEMO

【讨论】:

    【解决方案2】:

    这能满足你的需求吗?

    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;
    

    【讨论】:

    • 不。如果 col1 和 col4 都存在,那么它会同时获取两者。我只想要 col1 如果它存在。只有当 col1 不存在时,它才应该检查 col4。 col2 在所有情况下都必须存在
    • “存在”是指不为空吗?也许会有助于添加一个示例案例,其中您想要第一列为“001”的行和与您的评论匹配的案例。
    猜你喜欢
    • 2013-11-07
    • 2011-11-22
    • 2014-03-29
    • 2022-10-01
    • 1970-01-01
    • 2020-10-09
    • 1970-01-01
    • 2021-10-06
    相关资源
    最近更新 更多