Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
查看值是否存在于PostgresQL中每行的任何列中_Sql_Postgresql 9.1 - Fatal编程技术网

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

查看值是否存在于PostgresQL中每行的任何列中,sql,postgresql-9.1,Sql,Postgresql 9.1,想象我有这张表,我希望能够找到与每个id相关的品牌。 请注意,这并不等同于查找每一行是否存在该值,因为单个id可能存在多次。 在这种情况下,我期望的结果是梅赛德斯-奔驰 id | brand1 | brand2 | brand3 ----+---------------+---------------+--------------- 1 | Mercedes-Benz | | Fiat 2 | Honda |

想象我有这张表,我希望能够找到与每个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列

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

从这里,您可以使用标准的聚合函数来查找所需的信息:按品牌分组,并计算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);

奇数表设计。为什么有3个品牌栏目?我只有一行,还有更多行。感谢您的编辑,@jarlh还指定了预期的结果,并具有该表数据。这就是对结果的描述。现在指定它!好的,我已经编辑了问题@jarlh这似乎也有效。哪一个更有效,这一个还是使用交叉连接的?我不熟悉用横向连接来确定判断,但本能地,关键字应该比试图模仿它的查询更有效,因此Gordon Linoff的解决方案应该更好。
SELECT id, brand1 AS brand FROM table
UNION
SELECT id, brand2 FROM table
UNION
SELECT id, brand3 FROM table
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);