字段值作为PostgreSQL中主要详细信息的列

时间:2015-03-02 08:58:58

标签: postgresql

我在主 - 细节关系中有两个表,想要在一个选择查询中选择所有数据。

表“人”:

id;name
1;Allen
2;Bert
3;Chris

表“连接”:

id;personId;type;value
1;1;phone;+123456789
2;1;mail;allen@allen.allen
3;2;mail;bert@bert.bert
4;3;phone;+987654321
5;3;fax;+987654322

查询输出应该类似于

person.id;person.name;phone;mail;fax
1;Allen;+123456789;allen@allen.allen;
2;Bert;;bert@bert.com;
3;Chris;+987654321;;+987654322

任何想法可能没有写一些功能? 它应该在扩展detail-table时动态添加colummns。例如。在详细信息表中添加一行,如

6;2;icq;0123456789

我首选的解决方案适合选择查询。

谢谢! 帕特里克

3 个答案:

答案 0 :(得分:1)

无法将列添加到静态SQL查询中。

您正在使用的模型称为“实体 - 属性 - 值模型”。您可以谷歌了解其不同实施的详细信息。

在SQL中每个对象拥有许多动态属性的唯一“简单”方法(我能想到)是将它们全部转储到单个结构中,如HSTORE,JSON(B),BLOB ......在这种情况下输出会喜欢:

id;name;params
1;Allen;{"phone":"+123456789", "email":"allen@allen.allen"};
2;Bert;{"email":"bert@bert.com"};
3;Chris;{"phone":"+987654321", "fax":"+987654322"};

答案 1 :(得分:0)

您需要JOIN和CASE来选择所需的值。像这样:

SELECT  person.id,
    person.name,
    CASE connectivity.type WHEN 'phone' THEN value END AS phone,
    CASE connectivity.type WHEN 'mail' THEN value END AS mail,
    CASE connectivity.type WHEN 'fax' THEN value END AS fax
FROM    person
    JOIN connectivity ON person.id = connectivity.personId;

Offtopic:不要使用UPPER和小写的混合,PostgreSQL只使用小写,除非你把所有东西都放在“双引号”之间。

答案 2 :(得分:0)

select 
 p.name,
 phone.value phone,
 mail.value mail
from person p
left join connectivity phone on phone.personid = p.id and phone.type = 'phone'
left join connectivity mail on mail.personid = p.id and mail.type = 'mail'