Sql 构建动态查询Postgres

Sql 构建动态查询Postgres,sql,postgresql,Sql,Postgresql,我有一个表,其中存储了每个实体(员工、部门)的详细信息。我想从该表构建动态查询 CREATE TABLE MyTable ( Id int primary key, EntityId int, ColumnName varchar(100), tablename varchar(100) ); INSERT INTO MyTable (Id, EntityId, ColumnName, tableName) VALUES (1,1,'name','employe

我有一个表,其中存储了每个实体(员工、部门)的详细信息。我想从该表构建动态查询

CREATE TABLE MyTable
(
    Id int primary key,
    EntityId int,
    ColumnName varchar(100),
    tablename varchar(100)
);

INSERT INTO MyTable (Id, EntityId, ColumnName, tableName)
VALUES (1,1,'name','employee');

INSERT INTO MyTable (Id, EntityId, ColumnName, tableName)
VALUES (2,1,'id','employee');

INSERT INTO MyTable (Id, EntityId, ColumnName, tableName)
VALUES (3,1,'salary','employee');

INSERT INTO MyTable (Id, EntityId, ColumnName, tableName)
VALUES (4,2,'name','departement');

INSERT INTO MyTable (Id, EntityId, ColumnName, tableName)
VALUES (5,2,'location','departement');

INSERT INTO MyTable (Id, EntityId, ColumnName, tableName)
VALUES (6,2,'id','departement');
上面是我的表和insert脚本,我如何编写一个查询来提供如下输出

SELECT id,name,salary from employee

SELECT id,location,name from departement

如果我有多个实体,我应该选择多个语句。

< p>如果有令人沮丧的评论,你仍然想考虑这个方法,这里是一个查询,它构造每个实体的一个查询:

SELECT entityid,
  'SELECT ' ||
  string_agg(columnname, ', ' ORDER BY id) ||
  ' FROM ' ||
  tablename ||
  ';' AS query
FROM mytable
GROUP BY entityid, tablename;
以您的示例得出以下结果:

 entityid |                   query                   
----------+---------------------------------------------
        1 | SELECT name, id, salary FROM employee;
        2 | SELECT name, location, id FROM departement;
(2 rows)

如果有令人沮丧的评论,你仍然想考虑这个方法,下面是构造每个实体的一个查询的查询:

SELECT entityid,
  'SELECT ' ||
  string_agg(columnname, ', ' ORDER BY id) ||
  ' FROM ' ||
  tablename ||
  ';' AS query
FROM mytable
GROUP BY entityid, tablename;
以您的示例得出以下结果:

 entityid |                   query                   
----------+---------------------------------------------
        1 | SELECT name, id, salary FROM employee;
        2 | SELECT name, location, id FROM departement;
(2 rows)

你为什么要这样存储它?这是一个已知的反模式,称为EAV。你真的想沿着那条路走吗?在研究生中有更好的选择,这听起来是一个坏主意idea@JakubKania我在这里发布了一个虚拟模式,但我们确实有类似的模式。。我们存储它是为了进行批量更新,它从用户请求的多个表中选择行。。很抱歉没有发布原始模式以确保机密性。有什么特别的原因要这样存储吗?这是一个已知的称为EAV的反模式。你真的想沿着那条路走吗?在研究生中有更好的选择,这听起来是一个坏主意idea@JakubKania我在这里发布了一个虚拟模式,但我们确实有类似的模式。。我们存储它是为了进行批量更新,它从用户请求的多个表中选择行。。为保密起见,未发布原始架构,特此致歉。