有没有一种简单的方法可以将 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
我有一个模式,其中 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