查看 PostgresQL 中每一行的任何列中是否存在值

See if value exists in any column of every row in PostgresQL

假设我有这个 table,我希望能够找到与每个 ID 关联的品牌。 请注意,这不等同于查找每一行的值是否存在,因为一个 id 可能存在多次。 在这种情况下,我期望的结果是梅赛德斯-奔驰。

 id |    brand1     |    brand2     |    brand3
----+---------------+---------------+---------------
  1 | Mercedes-Benz |               | Fiat
  2 | Honda         |               | Mercedes-Benz
  3 | Audi          |               | Audi
  3 | Audi          |               | Mercedes-Benz
  4 | Mercedes-Benz |               | Mercedes-Benz
  5 | Mercedes-Benz | Mercedes-Benz |
  5 | Mercedes-Benz | Mercedes-Benz |
  6 | Mercedes-Benz |               | Mercedes-Benz
  7 | Mercedes-Benz | Mercedes-Benz |
  8 | Audi          |               | Audi
  8 | Audi          |               | Mercedes-Benz

我已经尝试使用 EXIST,但我一直无法找到一种优雅的“postgresql”方式来迭代 id 列。

结果:

  |    brand      |  
  +---------------+
  | Mercedes-Benz | 

您可以规范化数据(如果可能,请更改 table 结构,否则您可以 运行 查询以动态构建它)

SELECT id, brand1 AS brand FROM table
UNION
SELECT id, brand2 FROM table
UNION
SELECT id, brand3 FROM table

从那里,您可以使用标准聚合函数来查找您需要的信息:按品牌分组,并计算 ID 的数量

反透视数据——我建议使用横向连接——然后聚合:

select v.brand
from t cross join lateral
     (values (t.brand1), (t.brand2), (t.brand3)) v(brand)
group by brand
having count(distinct t.id) = (select count(distinct t.id) from t);