当前位置: 首页 > 知识库问答 >
问题:

根据列匹配条件筛选PostgreSQL表中的行

邴子实
2023-03-14

我有以下表在PostgreSQL 11.0

col1    col2      col3      col4
1       a         a         a          
1       a         a         a_1
1       a         a         a_2
1       b         b         c
2       d         d         c
3       e         d         e

我想过滤上表,这样,如果col2和col4相等,只应选择此匹配项,并排除下面两行。当col2和col4不相等时,应该保留col2=col3的行。

所需的输出是:

col1    col2      col3      col4
1       a         a         a          
1       b         b         c
2       d         d         c
3       e         d         e

我正在尝试下面的问题,到目前为止没有成功。

select * from table1
where col2=col4
union
select * from table1
where col2 !=  col4 and col2=col3 

但这将包括已经有匹配的行,我希望在最终输出中排除这些行。

1       a         a         a_1
1       a         a         a_2

共有2个答案

燕宜修
2023-03-14

根据我的理解,在给定的条件下,您希望在结果中使用唯一的col2

试试这个:

with cte as 
(select *, 
 case 
 when col2=col4 then 2 
 when col2=col3 then 1 
 else 0 
 end "flag" from table1 )
 
 select distinct on(col2) col1,col2,col3,col4 from cte where flag>0
order by col2, "flag" desc

小提琴演示

韦安顺
2023-03-14

我会用

SELECT DISTINCT ON (col2) *
FROM table1
WHERE col2 = col4 OR col2 = col3
ORDER BY col2, col2 IS DISTINCT FROM col4;

这依赖于FALSE

 类似资料:
  • 我创建了一个用户,他属于一个名为Security的组。在Camunda modeler中,我明确地将任务分配给了组设施。然而,在运行应用程序时,我可以看到属于组安全性的用户可以查看并声明分配给组设施的任务。 如何确保任务列表仅显示分配给特定用户组的任务?目标是用户可以查看另一个组的任务。

  • 我正在使用谷歌表单的过滤功能,但无法按我想要的方式使用,已经3天了。。。 基本上,我有第1页,有一列“电子邮件”和一列“潜在客户ID”。表2具有相同的“潜在客户ID”,但已过滤。含义,第1页,其“顺序为1,2,3,4,5…”。。。第二张不是,像是2,4,5,23,41。。。我想在表1中找到正确的电子邮件地址,该地址在两个表中具有相同的Lead ID。我使用了Filter函数,它工作得非常好,因为它

  • 我需要使用Sheets API阅读Google工作表。我可以获取所有行,但是由于这些行有上万行并且将继续增长,我需要找到一种方法来过滤它们而不获取所有行。 我只需要一个SQL WHERE子句,其中包含一个或多个列的相等条件。例如,在工作表中有一个phoneNumber列,它是C列。我只需要获取该列的值等于某个值的行。 我目前使用的Google Sheets V4 API为Node.js.我使用的是

  • 输入是按分数排序的,如下所示: 现在我需要在以下限制下从数组中选择10个得分最高的元素: 它们应该具有不同的 它们应该有不同的 同一。并且来自同一的任何子序列的长度不应大于2。 如果已经有一个选定的元素具有此,那么新元素将被丢弃。 如果已经有一个选定的元素具有这个,那么新元素将被丢弃。 如果已经有三个选定元素具有此,那么新元素将被丢弃。 如果在选定的尾部已经有两个元素具有此,那么新元素将被丢弃。

  • 给定一个表 我如何返回所有匹配的记录... 在另一行中至少有一个相同的值,并且 具有相同的mop_up中至少有一个必须设置为 和 值不相同,即仅返回与的行不匹配的值。 ...以便返回所有< code>irs_numbers(不仅仅是条件为真的一个-参见下面的例子)。 我尝试了此操作,但查询无法在合理时间内完成: 以及此处描述的重复计数的变化:如何在PostgreSQL中查找重复记录-它们总是只返回

  • 问题内容: 我试图做一个有条件的正则表达式,我知道堆栈溢出还有其他帖子,但是对这个问题太具体了。 如何创建仅在特定条件下才能匹配的正则表达式? 一个例子 例如,如果我们有一个字符串列表( 在java中 ): 并且我们只想匹配字符串末尾与开头相同数量的 在这个例子中我们想要什么 在此示例中,我们需要一个正则表达式来检查结尾处是否有与开始时相同数量的正则表达式。 条件部分 :如果开头有,则检查结尾是否