Postgresql Postgres:如何查找字段中具有重复值的行

Postgresql Postgres:如何查找字段中具有重复值的行,postgresql,duplicates,Postgresql,Duplicates,如何查找任何值在一行中是否存在多次?例如: id | c1 | c2 | c3 ----+----+----+---- 1 | a | b | c 2 | a | a | b 3 | b | b | b 查询应该返回第2行和第3行,因为它们多次具有相同的值。我寻找的解决方案不是“其中c1=c2或c1=c3或c2=c3”,因为我需要测试的表中可能有任意数量的列。所有值都是文本,但可以是任意长度。一种方法是将列转换为行: select * from the_table

如何查找任何值在一行中是否存在多次?例如:

 id | c1 | c2 | c3
----+----+----+----
  1 | a  | b  | c
  2 | a  | a  | b
  3 | b  | b  | b  

查询应该返回第2行和第3行,因为它们多次具有相同的值。我寻找的解决方案不是“其中c1=c2或c1=c3或c2=c3”,因为我需要测试的表中可能有任意数量的列。所有值都是文本,但可以是任意长度。

一种方法是将列转换为行:

select *
from the_table tt
where exists (select 1
              from ( values (c1), (c2), (c3) ) as t(v)
              group by v
              having count(*) > 1)
如果您想要一个不必列出每一列的动态解决方案,可以通过将行转换为JSON值来实现:

select *
from the_table tt
where exists (select 1
              from jsonb_each_text(to_jsonb(tt)) as j(k,v)
              group by v
              having count(*) > 1)