私はシナリオを持っていました。私はdbテーブル名とカラム名を格納するマスターテーブルを持っていました。それに基づいて動的クエリを構築する必要があります。Postgres Dynamic Query
CREATE TABLE MasterTable
(
Id int primary key,
caption varchar(100),
dbcolumnname varchar(100),
dbtablename varchar(100)
);
CREATE TABLE Engineers
(
Id int primary key,
Name varchar(100),
Salary BigInt
);
CREATE TABLE Executives
(
Id int primary key,
Name varchar(100),
Salary BigInt
);
CREATE TABLE Manager
(
Id int primary key,
Name varchar(100),
Salary BigInt
);
INSERT INTO Manager(Id, Name, Salary)
VALUES(1, 'Manager 1', 6000000);
INSERT INTO Executives(Id, Name, Salary)
VALUES(1, 'Executive 1', 6000000);
INSERT INTO Engineers(Id, Name, Salary)
VALUES(1, 'Engineer 1', 6000000);
INSERT INTO MasterTable(Id, caption, dbcolumnname, dbtablename)
VALUES (1, 'Name', 'name', 'Engineers');
INSERT INTO MasterTable(Id, caption, dbcolumnname, dbtablename)
VALUES (2, 'Name', 'name', 'Manager');
INSERT INTO MasterTable(Id, caption, dbcolumnname, dbtablename)
VALUES (3, 'Name', 'name', 'Executives');
INSERT INTO MasterTable(Id, caption, dbcolumnname, dbtablename)
VALUES (4, 'Salary', 'Salary', 'Engineers');
INSERT INTO MasterTable(Id, caption, dbcolumnname, dbtablename)
VALUES (5, 'Salary', 'Salary', 'Manager');
INSERT INTO MasterTable(Id, caption, dbcolumnname, dbtablename)
VALUES (6, 'Salary', 'Salary', 'Executives');
キャプションとIDを受け入れ、dbcolumnnameとdbtablenameに基づいて結果を返すストアドプロシージャを作成したいと考えています。たとえば、給与、名前をキャプション、IDを1とすると、ストアドプロシージャはdbcolumnとdbtableのクエリになります(以下のようになります)。
Select Id as ID, name as Value from Engineers
UNION
Select Id as ID, name as Value from Manager
UNION
Select Id as ID, name as Value from Executives
UNION
Select Id as ID, Salary as Value from Executives
UNION
Select Id as ID, Salary as Value from Engineers
UNION
Select Id as ID, Salary as Value from Manager
ここでは動的SQLについて聞いたことがありますか?
EDITは::私は、出力を得るために労働組合文を作成する1つの動的問合せを得ました、しかし、問題は、私は二重引用符をエスケープすることはできませんしています。以下はクエリとエラーです
Query :
DO
$BODY$
BEGIN
EXECUTE string_agg(
format('SELECT %I FROM %I', dbcolumnname, dbtablename),
' UNION ')
FROM MasterTable;
END;
$BODY$;
Error:
ERROR: relation "Engineers" does not exist
LINE 1: SELECT name FROM "Engineers" UNION SELECT name FROM "Manager...
ダイナミッククエリは非常に簡単です。しかし、私はあなたのデータモデルを再考すべきだと思います。あなたが達成したいタスクのために少し複雑すぎるように見える... – JosMac
@JosMacはいそれは複雑ですが、これは私のデータモデルではありません。私はフォーラムで元のデータを投稿できないので、ダミーモデルを作成しました。私は動的クエリで複数のテーブル名を使用することができますか、私は高価な私が信じるカーソルに行く必要があります。 –
動的クエリで必要なクエリを使用できます。挿入/更新などを伴う複雑なCTEイベント。制限はありません。 – JosMac