首页 > 解决方案 > 有没有一种简单的方法可以将 name:value 子级转换为 postgresql 中的列?

问题描述

我有一个模式,其中 EMP 表有一个子表 EMP_ATTRIBUTE,它是名称值对,因此......

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

一个典型的 emp(id=1,name=Juan)会有子属性 title=manager,education=degree,nationality=spain 等等

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

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

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

标签: sqlpostgresqlgroup-bypivotentity-attribute-value

解决方案


您可以加入表,并进行条件聚合:

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

推荐阅读