如果值存在于多个列之一中,则PostgreSQL返回行

时间:2018-03-27 13:02:57

标签: sql postgresql

好的,我被困在这个。

我有一个PostgreSQL表客户,看起来像这样:

id firm1 firm2 firm3 firm4 firm5 lastname firstname
1  13    8     2     0     0     Smith    John
2  3     2     0     0     0     Doe      Jane

每行对应一个客户/客户。每个客户/客户可以与一个或多个公司相关联;每个公司#columns下的数值对应于另一个表中的公司ID。

所以我正在寻找一种方法来返回与特定公司相关的所有客户行。

例如,在firm1,firm2,firm3,firm4,firm5中存在的SELECT id,lastname,firstname将返回John Smith行,因为他在firm2列下与公司8相关联。

关于如何实现这一目标的任何想法?

3 个答案:

答案 0 :(得分:1)

您应该考虑规范化您的表格,使用当前架构,您应该加入firms表,与客户表中公司字段的数量一样多。

select    *
from      customers c
left join firms f1
on        f1.firm_id = c.firm1
left join firms f2
on        f2.firm_id = c.firm2
left join firms f3
on        f3.firm_id = c.firm3
left join firms f4
on        f4.firm_id = c.firm4

答案 1 :(得分:1)

您可以使用IN运算符:

SELECT *
FROM customer
where 8 IN (firm1, firm2, firm3, firm4, firm5);

但是如果你的数据模型标准化,那么从长远来看会好得多。

答案 2 :(得分:1)

您可以使用arrayunnest的组合“展开”,如此答案中所述:unpivot and PostgreSQL

在您的情况下,我认为这应该有效:

select lastname,
    firstname,
    unnest(array[firm1, firm2, firm3, firm4, firm5]) as firm_id
from customer

现在您可以从此表中选择(使用with语句或内部查询),其中firm_id是您关注的值