有没有一种简单的方法可以将 name:value children 转换为 postgresql 中的列?

Is there an easy way to convert name:value children to columns in postgresql?

我有一个模式,其中 EMP table 有一个 child table EMP_ATTRIBUTE 这是名称值对,因此...

emp: id, name
emp_attribute:  id, emp_id, name, value 

典型的 emp(id=1,name=Juan)将具有 child 属性 title=manager,education=degree,nationality=spain,等等

有没有我可以 运行 将所有 emp_attribute 行组合成一个元组的查询

id   |    name     |   title     |   education    |    nationality
1    |    Juan     |   manager   |   degree       |    spain

作为背景,我采用这种方法的原因是属性列表不断变化,并且对于不同类别的员工是不同的。我不想必须更改架构才能支持新属性。我确实考虑过 JSON 数据类型,但我更愿意尽可能保持关系。

您可以连接表,并进行条件聚合:

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