2017-01-12 65 views
0

我有表存儲每個實體(員工,部門)的詳細信息。我想從該表中構建動態查詢。建設動態查詢Postgres

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'); 

以上就是我的表並插入腳本,我如何編寫一個查詢這使我的輸出類似下面。

SELECT id,name,salary from employee 

SELECT id,location,name from departement 

如果我有多個實體,我應該多選擇語句。

+1

任何特別的原因你想這樣存儲嗎? –

+3

這是一種稱爲EAV的已知反模式。你真的想走那條路嗎?在Postgres中有更好的替代方案可以做到這一點 –

+1

這聽起來像個壞主意 –

回答

2

如果不顧勸阻意見,你還是要考慮這種方法,這裏是構建每個實體一個查詢的查詢:

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)