查看 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);
假设我有这个 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);