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我在这里发布了一个虚拟模式,但我们确实有类似的模式。。我们存储它是为了进行批量更新,它从用户请求的多个表中选择行。。为保密起见,未发布原始架构,特此致歉。