在postgresql中是否有一种简单的方法可以将name:value子项转换为列?
我有一个模式,其中EMP表有一个子表EMP_属性,即名称-值对,因此在postgresql中是否有一种简单的方法可以将name:value子项转换为列?,sql,postgresql,group-by,pivot,entity-attribute-value,Sql,Postgresql,Group By,Pivot,Entity Attribute Value,我有一个模式,其中EMP表有一个子表EMP_属性,即名称-值对,因此 emp: id, name emp_attribute: id, emp_id, name, value 一个典型的emp(id=1,name=Juan)的子属性为title=经理,education=学位,national=西班牙等 我是否可以运行一个查询,将所有emp_属性行合并到一个元组中 id | name | title | education | national
emp: id, name
emp_attribute: id, emp_id, name, value
一个典型的emp(id=1,name=Juan)的子属性为title=经理,education=学位,national=西班牙等
我是否可以运行一个查询,将所有emp_属性行合并到一个元组中
id | name | title | education | nationality
1 | Juan | manager | degree | spain
作为背景,我之所以采用这种方法,是因为属性列表在不断变化,并且对于不同类别的员工是不同的。我不想为了支持新属性而进行模式更改。我确实考虑了JSON数据类型,但是我更希望保持尽可能的关系。 < P>可以加入表,并进行条件聚合:
select
e.id
max(ea.value) filter(where ea.name = 'name') name,
max(ea.value) filter(where ea.name = 'title') title,
max(ea.value) filter(where ea.name = 'education') education,
max(ea.value) filter(where ea.name = 'nationality') nationality
from emp e
inner join emp_attribute ea on ea.emp_id = e.id
group by e.id
您可以加入表,并进行条件聚合:
select
e.id
max(ea.value) filter(where ea.name = 'name') name,
max(ea.value) filter(where ea.name = 'title') title,
max(ea.value) filter(where ea.name = 'education') education,
max(ea.value) filter(where ea.name = 'nationality') nationality
from emp e
inner join emp_attribute ea on ea.emp_id = e.id
group by e.id
非常感谢。这当然回答了我的问题。不幸的是,它的副作用是添加一个新属性需要修改SQL。有没有什么方法可以在不显式命名每个属性的情况下检索所有属性?@pinoyyid:没有,除非您希望在命名列中显式命名它们。但是,也许一个JSON值(作为结果)是一种替代方法?JSON结果就可以了,因为resultset是供RESTAPI使用的,非常感谢。这当然回答了我的问题。不幸的是,它的副作用是添加一个新属性需要修改SQL。有没有什么方法可以在不显式命名每个属性的情况下检索所有属性?@pinoyyid:没有,除非您希望在命名列中显式命名它们。但是可能一个JSON值(作为结果)是一个替代方案?JSON结果就可以了,因为resultset无论如何都是供RESTAPI使用的