Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在postgresql中是否有一种简单的方法可以将name:value子项转换为列?_Sql_Postgresql_Group By_Pivot_Entity Attribute Value - Fatal编程技术网

在postgresql中是否有一种简单的方法可以将name:value子项转换为列?

在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表有一个子表EMP_属性,即名称-值对,因此

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使用的